我的索引中有一个嵌套字段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_a
,type_b
,type_c
。所以我不得不说 163459 和 163505 在 294088 文档中差别不大。
我在Elasticsearch Reference [2.1]
中只收到一条信息与常规query_string查询不同,simple_query_string查询永远不会抛出异常,并丢弃查询的无效部分。
我不认为这是产生差异的原因。
我想知道是什么导致query_string
和simple_query_string
之间的结果略有不同?
答案 0 :(得分:1)
据我所知,nested query syntax
或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 并返回结果。
您还可以使用query_string
explain api
类似的内容
同样query_string
和simple_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
旨在与不安全的输入一起使用。
这样用户可以输入任何内容,如果输入无效,不会抛出异常。将简单地丢弃无效输入。