查询字符串查询中范围字段的ElasticSearch范围查询

flseospp  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(0)|浏览(253)

我们正在将elasticsearch从5.2更新到5.6,并准备更新到6.x,然后再更新到7.x。
在从5.2更新到5.6之后,在用我们所有的文档创建了新的索引之后,我们注意到有些东西和以前不一样了。
当使用查询字符串查询(即?q=…)时,我们过去可以对范围字段执行范围查询。但是在更新之后,这会导致一个错误。
例如,我们有这样一个字段Map:

"typicalAgeRange": {
    "type": "integer_range"
}

在过去,我们可以进行如下查询:

?q=typicalAgeRange:[0 TO 12]

这将返回所有年龄范围为0-12的文档(例如6-8、6-14、0-4等)
但是,当我们现在在5.6上运行相同的查询时,我们得到:

{
  "error": {
    "root_cause": [
      {
        "type": "query_shard_exception",
        "reason": "failed to create query: {\n  \"query_string\" : {\n    \"query\" : \"typicalAgeRange:[0 TO 12]\",\n    \"fields\" : [ ],\n    \"use_dis_max\" : true,\n    \"tie_breaker\" : 0.0,\n    \"default_operator\" : \"or\",\n    \"auto_generate_phrase_queries\" : false,\n    \"max_determinized_states\" : 10000,\n    \"enable_position_increments\" : true,\n    \"fuzziness\" : \"AUTO\",\n    \"fuzzy_prefix_length\" : 0,\n    \"fuzzy_max_expansions\" : 50,\n    \"phrase_slop\" : 0,\n    \"analyze_wildcard\" : false,\n    \"escape\" : false,\n    \"split_on_whitespace\" : true,\n    \"boost\" : 1.0\n  }\n}",
        "index_uuid": "4XB5FxxVSvq1pDxvTRRS3Q",
        "index": "udb3_core_v20201014145500"
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "udb3_core_v20201014145500",
        "node": "sXvyyNlvRPyfYo3Gk2aC0g",
        "reason": {
          "type": "query_shard_exception",
          "reason": "failed to create query: {\n  \"query_string\" : {\n    \"query\" : \"typicalAgeRange:[0 TO 12]\",\n    \"fields\" : [ ],\n    \"use_dis_max\" : true,\n    \"tie_breaker\" : 0.0,\n    \"default_operator\" : \"or\",\n    \"auto_generate_phrase_queries\" : false,\n    \"max_determinized_states\" : 10000,\n    \"enable_position_increments\" : true,\n    \"fuzziness\" : \"AUTO\",\n    \"fuzzy_prefix_length\" : 0,\n    \"fuzzy_max_expansions\" : 50,\n    \"phrase_slop\" : 0,\n    \"analyze_wildcard\" : false,\n    \"escape\" : false,\n    \"split_on_whitespace\" : true,\n    \"boost\" : 1.0\n  }\n}",
          "index_uuid": "4XB5FxxVSvq1pDxvTRRS3Q",
          "index": "udb3_core_v20201014145500",
          "caused_by": {
            "type": "illegal_argument_exception",
            "reason": "Field [typicalAgeRange] of type [integer_range] does not support range queries"
          }
        }
      }
    ]
  },
  "status": 400
}

我现在阅读了5.2和5.6的文档:
可以为日期、数字或字符串字段指定范围。
5.2: https://www.elastic.co/guide/en/elasticsearch/reference/5.2/query-dsl-query-string-query.html#_ranges
5.6: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/query-dsl-query-string-query.html#_ranges
所以这似乎从来没有得到官方的支持(或者没有记录在案)?但为什么它在那之前起作用,而现在不再起作用了?
到目前为止,5.2还在生产环境中运行,同样的查询仍然可以在那里工作。
更新:更多信息。
如果我们在json主体中执行范围查询,我们会得到预期的结果。例如:

{
    "query": {
        "range" : {
            "typicalAgeRange" : {
                "gte" : 0,
                "lte" : 12,
                "boost" : 2.0
            }
        }
    }
}

退货:

{
   "took":6,
   "timed_out":false,
   "_shards":{
      "total":5,
      "successful":5,
      "skipped":0,
      "failed":0
   },
   "hits":{
      "total":6,
      "max_score":2.0,
      "hits":[
        ... // ommited for brevity
      ]
   }
}

所以json范围查询在范围字段上似乎工作得很好。但是,出于多种原因,我们也需要它在lucene语法中工作(向后兼容性是一个显而易见的问题,因为我们有一些系统使用这种语法,而我们现在无法重构这种语法。)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题