elasticsearch 什么';简单查询字符串和查询字符串之间的区别是什么?,elasticsearch,lucene,elasticsearch,Lucene" /> elasticsearch 什么';简单查询字符串和查询字符串之间的区别是什么?,elasticsearch,lucene,elasticsearch,Lucene" />

elasticsearch 什么';简单查询字符串和查询字符串之间的区别是什么?

elasticsearch 什么';简单查询字符串和查询字符串之间的区别是什么?,elasticsearch,lucene,elasticsearch,Lucene,我的索引中有一个嵌套字段source,如下所示: "source": [ { "name": "source_c","type": "type_a" }, { "name": "source_c","type": "type_b" } ] 我使用query\u stringquery和simple\u query\u stringquery来查询type\u a,得到了两个不同的结果 查询字符串 { "size" :

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

"source": [    
    {
        "name": "source_c","type": "type_a"
    },
    {
        "name": "source_c","type": "type_b"
    }
]
我使用
query\u string
query和
simple\u query\u string
query来查询
type\u a
,得到了两个不同的结果

查询字符串

{
  "size" : 3,
  "query" : {
    "bool" : {
      "filter" : {
        "query_string" : {
          "query" : "source:\"source.type:=\"type_a\"\""
        }
      }
    }
  }
}
{
  "size": 3,
  "query": {
    "bool": {
      "filter": {
        "simple_query_string": {
          "query": "source:\"source.type:=\"type_a\"\""
        }
      }
    }
  }
}
我在294088份文档中点击了163459次

简单查询字符串

{
  "size" : 3,
  "query" : {
    "bool" : {
      "filter" : {
        "query_string" : {
          "query" : "source:\"source.type:=\"type_a\"\""
        }
      }
    }
  }
}
{
  "size": 3,
  "query": {
    "bool": {
      "filter": {
        "simple_query_string": {
          "query": "source:\"source.type:=\"type_a\"\""
        }
      }
    }
  }
}
我在294088份文档中点击了163505次

我只随机制作了三种不同类型的
类型a
类型b
类型c
。所以我不得不说163459163505294088文档中的差异非常小

我只收到一条信息

与常规查询\u字符串查询不同,简单查询\u字符串查询永远不会引发异常,并丢弃查询的无效部分

我不认为这是造成差异的原因


我想知道是什么使
query\u string
simple\u query\u string
之间的结果略有不同?

据我所知,
query\u string
simple\u query\u string
都不支持
嵌套查询语法。这是一个问题,这是关于这个问题的关键

那你是怎么得到结果的?这里将帮助你了解发生了什么。这个问题

{
  "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,source.typetype_a,它找到type_a并返回结果。 使用
explain-api

另外,
query\u string
simple\u query\u string
也有不同的语法,例如
字段名称:
simple\u query\u string
不支持搜索文本

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

编辑

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

{
  "query": {
    "nested": {
      "path": "source",
      "query": {
        "term": {
          "source.type": {
            "value": "type_a"
          }
        }
      }
    }
  }
}
希望这有帮助

简单查询\u字符串
用于不安全输入


这样用户可以输入任何内容,如果输入无效,它将不会引发异常。只需丢弃无效输入。

字段
类型的映射是什么?
字符串和未分析的字符串当您两次使用
字段时,您使用的查询字符串看起来很奇怪(
源:\“source.type:=\”type\u a\“\”
)。你确定你的语法吗?此外,您需要知道
simple\u query\u string
使用的查询语法与
query\u string
不同。