【问题标题】:what's difference between simple_query_string and query_string?simple_query_string 和 query_string 有什么区别?
【发布时间】:2016-01-05 03:36:01
【问题描述】:

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

"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。所以我不得不说 163459163505294088 文档中差别很小。

我在Elasticsearch Reference [2.1] 中没有得到任何信息

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

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

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

【问题讨论】:

  • 字段type的映射是什么?
  • 字符串和未分析
  • 您使用的查询字符串看起来很奇怪 (source:\"source.type:=\"type_a\"\"),因为您使用了两次 source 字段。你确定你的语法吗?此外,您需要知道simple_query_string 不使用与query_string 相同的查询语法。

标签: elasticsearch lucene


【解决方案1】:

据我所知,query_stringsimple_query_string 都不支持 nested query syntax。这是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 寻找术语 sourcesource.type type_a,它找到 type_a 并返回结果。 您还可以使用explain api 找到与query_string 类似的内容

另外query_stringsimple_query_string 有不同的语法,例如field_name:search_textsimple_query_string 中不受支持。

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

编辑

这个查询会给你想要的结果。

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    Acording to the documentation simple_query_string 用于不安全输入

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

    【讨论】:

      猜你喜欢
      • 2016-10-07
      • 2013-05-18
      • 2011-01-11
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      相关资源
      最近更新 更多