simple_query_string和query_string有什么区别?

fmy*_*ack 5 lucene elasticsearch

source我的索引中有一个嵌套字段,看起来像这样:

"source": [    
    {
        "name": "source_c","type": "type_a"
    },
    {
        "name": "source_c","type": "type_b"
    }
]
Run Code Online (Sandbox Code Playgroud)

我使用query_string查询和simple_query_string查询来查询,type_a并得到两个不同的结果。

请求参数

{
  "size" : 3,
  "query" : {
    "bool" : {
      "filter" : {
        "query_string" : {
          "query" : "source:\"source.type:=\"type_a\"\""
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我在294088文档中获得了163459次点击。

simple_query_string

{
  "size": 3,
  "query": {
    "bool": {
      "filter": {
        "simple_query_string": {
          "query": "source:\"source.type:=\"type_a\"\""
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我在294088文档中获得了163505次点击。

我只进行了三次不同类型type_a,type_b,type_c随机。因此,我不得不说163459和163505在294088文档中差别不大。

我在Elasticsearch参考[2.1]中只得到一个信息

与常规的query_string查询不同,simple_query_string查询将永远不会引发异常,并丢弃查询的无效部分。

我不认为这是与众不同的原因。

我想知道什么使query_string和之间的结果有些不同simple_query_string?

Chi*_*h25 3

据我所知,或 都不nested query syntax支持。这是一个悬而未决的问题,这就是query_stringsimple_query_string有关该问题的PR。

那么你如何得到结果呢?这里Explain API将帮助您了解发生了什么。这个查询

{
  "size": 3,
  "query": {
    "bool": {
      "filter": {
        "simple_query_string": {
          "query": "source:\"source.type:=\"type_a\"\""
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

看一下输出,你会看到

"description": "ConstantScore(QueryWrapperFilter(_all:source _all:source.type _all:type_a)), 
Run Code Online (Sandbox Code Playgroud)

所以这里发生的是 ES 寻找术语source、source.type 或 type_a,它找到type_a并返回结果。你还会发现类似的东西query_string使用类似的东西explain api

并且query_string和simple_query_string具有不同的语法,例如field_name:search_text不支持simple_query_string.

查询嵌套对象的正确方法是使用嵌套查询

编辑

该查询将为您提供所需的结果。

{
  "query": {
    "nested": {
      "path": "source",
      "query": {
        "term": {
          "source.type": {
            "value": "type_a"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!!