ES的查询分为两种机制
- 根据文档和查询文本的相关度,根据从高到低返回
- 过滤机制,只根据
全文查询
match查询
- 用于匹配单个字段
- 查询时,首先ES会根据查询文本,根据分析器对查询文本进行分词处理,再根据分词结果查询数据字段是否匹配
- 和operator结合使用,如果为and,则表示文本分词需要全部匹配;or表示只需要一个匹配即可
curl --location --request POST 'http://127.0.0.1:9200/hinickname/_search?format=json' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": {
"match": {
"name": {
"query": "张 兴",
"operator": "and"
}
}
}
}'
- 参数说明
- query--match为固定写法
- name为要查询的字段,query中表示要查询的文本,operator为查询方式,可以不写。
- 这里name为 张 兴,分词器会分为两次词,即 张和兴,如果operator为and,则字段name需要同时匹配 张和兴,如果为or则只需要匹配一个即可
- operator值由or、and两种
match_phrase(短句匹配)
curl --location --request POST 'http://127.0.0.1:9200/library/_search?format=json' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": {
"match_phrase": {
"author": "Frank Her"
}
}
}'
- 分词器会对查询条件进行分词,分词后,需要查询字段的值中分别包含这两个词(这里是词包含,并不是只有包含一个字就行,例如:张艺兴 不会匹配到张,因为张艺兴是一个完整的词,能匹配到张艺兴)
- 同时包含词语的顺序要一致,即前后顺序
也可以在match中使用,只需要指定type即可
curl --location --request POST 'http://127.0.0.1:9200/hinickname/_search?format=json' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": {
"match": {
"name": {
"query": "张 兴",
"type":"phrase"
}
}
}
}'