elasticsearch – simple_query_string和query_string之间有什么区别?

我的索引中有一个嵌套的字段源代码如下:

"source": [    
    {
        "name": "source_c","type": "type_a"
    },
    {
        "name": "source_c","type": "type_b"
    }
]

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

请求参数

{
  "size" : 3,
  "query" : {
    "bool" : {
      "filter" : {
        "query_string" : {
          "query" : "source:\"source.type:=\"type_a\"\""
        }
      }
    }
  }
}

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

simple_query_string

{
  "size": 3,
  "query": {
    "bool": {
      "filter": {
        "simple_query_string": {
          "query": "source:\"source.type:=\"type_a\"\""
        }
      }
    }
  }
}

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

我只随机地制作了三种不同类型的type_a,type_b,type_c.所以我不得不说163459和163505在294088文档中差别不大.

我在Elasticsearch Reference [2.1]中得到了一个信息

Unlike the regular query_string query, the simple_query_string query will never throw an exception, and discards invalid parts of the query.

我不认为这是产生差异的原因.

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

最佳答案 据我所知,query_string或simple_query_string不支持嵌套查询语法.它是
open issue,这是关于该问题的
PR.

那你怎么得到结果呢?这里Explain API将帮助您了解正在发生的事情.这个查询

{
  "size": 3,
  "query": {
    "bool": {
      "filter": {
        "simple_query_string": {
          "query": "source:\"source.type:=\"type_a\"\""
        }
      }
    }
  }
}

看看输出,你会看到

"description": "ConstantScore(QueryWrapperFilter(_all:source _all:source.type _all:type_a)), 

所以这里发生的是ES寻找术语源,source.type或type_a,它找到type_a并返回结果.
您还可以使用explain api找到与query_string类似的内容

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

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

编辑

此查询将为您提供所需的结果.

{
  "query": {
    "nested": {
      "path": "source",
      "query": {
        "term": {
          "source.type": {
            "value": "type_a"
          }
        }
      }
    }
  }
}

希望这可以帮助!!

点赞