ES学习之_search查询接口

211 阅读1分钟

ES的查询分为两种机制

  1. 根据文档和查询文本的相关度,根据从高到低返回
  2. 过滤机制,只根据

全文查询

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"
            }
        }
    }
}'