@@注意:本篇笔记使用的ElasticSearch7.5

1.搜索形式

ElasticSearch 搜索形式,分为两种:URI SearchRequest Body Search

1.1 URI Search请求形式

# 在浏览器中输入: http://elasticsearch:9200/test_db/_search?q=name:张
curl -XGET "http://elasticsearch:9200/test_db/_search?q=name:张"

1.2 Request Body Search请求形式

ElasticSearch 中一些高阶用法只能在 Request Body 里做,所以我们尽量使用 Request Body Search,它支持 GETPOST 方式对索引进行查询

# GET方式
curl -XGET "http://elasticsearch:9200/test_db/_search" -H 'Content-Type: application/json' -d'{
"query": {
"match": {
"name": "张"
}
}
}'
# POST方式
curl -XPOST "http://elasticsearch:9200/test_db/_search" -H 'Content-Type: application/json' -d'{
"query": {
"match": {
"name": "张"
}
}
}'

2.搜索结果分析

2.1 返回格式和说明

{
//搜索请求耗费了多少毫秒
"took":0,
//搜索是否超时,请求时可自定义timeout参数,如:/_search?timeout=10ms
"timed_out":false,
// 分片信息
"_shards":{
// 在查询中参与分片的总数
"total":1,
// 成功的分片数量
"successful":1,
//跳过分片数量
"skipped":0,
//失败的分片数量
"failed":0
},
"hits":{
"total":{
//表示匹配到的文档总数
"value":1,
//描述value结果的准确性,当eq时准确,gte不准确
"relation":"eq"
},
//相关度的匹配分数,分数越高月相关
"max_score":1.0296195,
"hits":[
{
"_index":"test_db",//索引名称
"_type":"_doc",//文档类型
"_id":"pkCkRHgBl3R2rXlflr9j",//文档ID,唯一
//这条记录的匹配分数
"_score":1.0296195,
//结果集中的具体字段
"_source":{
"name":"张三封",
"age":19,
"home":"北京昌平"
}
}
]
}
}

3.URI Search使用

3.1 参数列表

参数 描述
q 在全文中搜索str,q=str或者q=字段:str
df 指定在哪个字段查询,不指定时会对所有字段进行查询
analyzer 当分析查询字符串的时候使用的分词器.
sort 根据字段名排序,?sort=x:desc(倒序),默认正序
from 返回的索引匹配结果的开始值,默认为 0
size 搜索结果返回的条数,默认为 10
timeout 设置查询超时时间,单位ms(毫秒)如:?timeout=1ms
_source_includes 只返回索引中指定的列,多个列中间用逗号分开。
如:/_search?_source_includes=name,age
_source_excludes 返回结果中不包含的字段多个列中间用逗号分开。
如:/_search?_source_excludes=name,age
_score 是否返回字段信息,默认true:都返回
explain 在每个返回结果中,包含评分机制的解释,默认:false
terminate_after 设置每个分片中查询的最大条数,如果设置结果中会有一个terminated_early
search_type 搜索的类型,合适类型能提高搜索性能,类型有:dfs_query_then_fetch
query_then_fetch,默认:query_then_fetch
default_operator 多个条件的关系,AND 或者 OR,默认为 OR

4. q

4.1 所有字段中搜索

image-20210318182428734

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=张

4.2 指定字段中搜索

image-20210318182654785

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=name:张

使用 http://elasticsearch:9200/test_db/_search?q=张&df=name一样可以实现一样的效果

4.3 多字段查询

# 查找名字中含有张、王的记录,(name like %张% or name like %王%)
http://elasticsearch:9200/test_db/_search?q=name:张 王

# 想查找name中有张、并且age=19的记录
http://elasticsearch:9200/test_db/_search?q=name:张 age:21&default_operator=AND

4.4 比较查询

# q=age:<=21 年龄小于等于21岁的
# q=age:>21 年龄大于21岁的
curl -XGET "http://elasticsearch:9200/test_db/_search?q=age:<=21"

4.5 范围查询

仅用数字类型,日期也是数字类型

表示符号

# [] : 表示闭区间
# {} : 表示开区间

使用示例

# 年
year:({2019 TO 2020]) 表示 2019 < year <= 2020。
year:([* TO 2020]) 表示 year <= 2020。
year:({2019 TO *}) 表示 year > 2019。

4.6 布尔查询

表示符号

# +(%2B): 必须包含,注意+ 用 %2B(url encode) 表示
# -: 不能包含

使用示例

# 名字中必须包含张
http://elasticsearch:9200/test_db/_search?q=name:(%2B张)
# 名字中包含张,但不包含三的
http://elasticsearch:9200/test_db/_search?q=name:(%2B张 -三)
# 名字中,即不包含张,也不包含三的
http://elasticsearch:9200/test_db/_search?q=name:(-张 -三)

4.7 词组查询

# 查找包含 NO ABC,并且顺序一致的记录
http://elasticsearch:9200/test_db/_search?q="NO ABC"

进行词组查询时,被查找的词必须用“”引住,引住后会被当成一个单词查询

5.analyzer(分词器)

系统默认分词器有:keywordstandardsimple等等,也支持第三方分词器,如IK

需要注意的是,在指定分词器参数的时候必须要使用q进行字段查询

5.1 使用分词器:keyword

第一步: 先分析分词器:keyword,会把字符串张三封分词成什么样,如下图:

image-20210319111249000

第二步: 使用分词器查询

image-20210319111445773

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=张三封&analyzer=keyword

5.2 使用分词器:standard

第一步: 先分析分词器:standard,会把字符串张三封分词成什么样,如下图:

image-20210319111620681

第二步: 使用分词器查询

image-20210319111915469

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=张三封&analyzer=standard&df=name

6.sort(排序)

# 按照年龄正序
http://elasticsearch:9200/test_db/_search?sort=age
# 按照年龄倒序
http://elasticsearch:9200/test_db/_search?sort=age:desc

7.from,size(分页)

# 从索引0开始取一条数据
http://elasticsearch:9200/test_db/_search?from=0&size=1
# 从索引1开始取两条数据
http://elasticsearch:9200/test_db/_search?from=0&size=2

8.返回字段处理

  • _source_includes=a,b: 指定只返回a,b字段
  • _source_excludes=a,b:指定不返回a,b字段
  • _score=false:什么字段都不返回
# _score中只返回 name,age
http://elasticsearch:9200/test_db/_search?_source_includes=name,age

# _score中除了home字段不返回,其他字段都返回
http://elasticsearch:9200/test_db/_search?_source_excludes=home

# _score中什么字段都不返回
http://elasticsearch:9200/test_db/_search?_score=false

9.评分机制

image-20210319145233496

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=张&explain=true

10.设置分片返回数量

image-20210319145821452

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=张&terminate_after=1