elasticsearch匹配vs术语查询

时间:2014-04-18 08:48:15

标签: elasticsearch

我使用匹配查询搜索" request.method":" GET":

    {
      "query": {
        "filtered": {
          "query": {
            "match": {
              "request.method": "GET"
            }
          },
          "filter": {
            "bool": {
              "must": [
...

正如预期的那样,匹配查询可以获得结果,如下所示:

enter image description here

但问题是在使用Term查询时,没有结果。

更新查询以更改"匹配" to" term",并保持其他部分保持不变:

{
  "query": {
    "filtered": {
      "query": {
        "term": {
          "request.method": "GET"
        }
      },
      "filter": {
        "bool": {
          "must": [
...

我认为Term查询是"未分析"匹配查询的版本。如上图所示,至少有一条记录有" request.method"等于" GET"。为什么上述Term查询没有结果?谢谢。

enter image description here

2 个答案:

答案 0 :(得分:79)

假设您使用Standard Analyzer GET变为get存储在索引中。源文档仍然具有原始的“GET”。

match查询将相同的标准分析器应用于搜索词,因此将匹配索引中存储的内容。 term查询不会将任何分析器应用于搜索字词,因此只会在倒排索引中查找该确切字词。

要在示例中使用术语查询,请将大写“GET”更改为小写“get”或更改映射,以便将request.method字段设置为not_analyzed

答案 1 :(得分:2)

elasticsearch 中 term 和 match 的区别

Term 是一个精确的查询

匹配是一个模糊查询

term 是完美匹配,即精确查询。搜索词在搜索之前不会被切分,所以我们的搜索词必须是文档切分集之一。假设我们要查找所有名为 Jesus Verma 的文档。

 $curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
  "query":{
    "term":{
"title": "Jesus Verma"
    }
  }
}'

匹配查询将首先对搜索词进行分类。分词后,分词结果会一一匹配。因此,相较于term的精确搜索,match是分词匹配搜索,匹配搜索有两个功能相似的变体。一种是match_phrase。一种是multi_match

$curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
    "query": {
        "match": {
 "content": "Banglore, India"
        }
    }
}'