simple_query_string和query_string之间的区别是什么?

时间:2016-01-05 03:36:01

标签: elasticsearch lucene

我的索引中有一个嵌套字段source,如下所示:

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

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

QUERY_STRING

{
  "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_atype_btype_c。所以我不得不说 163459 163505 294088 文档中差别不大。

我在Elasticsearch Reference [2.1]

中只收到一条信息
  

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

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

我想知道是什么导致query_stringsimple_query_string之间的结果略有不同?

2 个答案:

答案 0 :(得分:1)

据我所知,nested query syntaxquery_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 并返回结果。 您还可以使用query_string

找到与explain api类似的内容

同样query_stringsimple_query_string的语法也不同,field_name:search_text不支持simple_query_string

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

修改

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

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

希望这会有所帮助!!

答案 1 :(得分:1)

Acording to the documentation simple_query_string旨在与不安全的输入一起使用。

这样用户可以输入任何内容,如果输入无效,不会抛出异常。将简单地丢弃无效输入。