Запрос диапазона Elasticsearch на поле диапазона в строке запроса запрос

#elasticsearch

#elasticsearch

Вопрос:

Мы находимся в процессе обновления нашего Elasticsearch с версии 5.2 до версии 5.6, а также готовимся к обновлению до версии 6.x, а затем 7.x позже.

После обновления с 5.2 до 5.6 и после создания новых индексов со всеми нашими документами мы заметили, что что-то работает не так, как раньше.

При использовании запроса строки запроса (т. Е. ?q = …) Мы могли выполнять запросы диапазона для полей диапазона. Но после обновления это приводит к ошибке.

Например, у нас есть сопоставление полей, подобное этому:

 "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.0n  }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.0n  }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 по нескольким причинам. (Обратная совместимость является одной из очевидных, потому что у нас есть некоторые системы, которые используют этот синтаксис, и мы не можем его реорганизовать сейчас.)

Комментарии:

1. Что происходит, когда вы преобразуете эту строку запроса в стандартный range запрос? elastic.co/guide/en/elasticsearch/reference/5.6/… Та же ошибка?

2. Я помню, что у меня была эта ошибка 3-4 года назад (иш)… однако это было исправлено, и, протестировав это в последней версии, оно работает так, как ожидалось.

3. Привет, @joe. Я обновил свой вопрос дополнительной информацией, поскольку ее было слишком много для публикации в комментарии.

4. Спасибо @Val. Таким образом, единственным решением будет обновление до 6.x или 7.x? В любом случае, это наш план, но мы надеялись сначала обновиться до версии 5.6, чтобы мы могли использовать свертывание полей, а затем потратить некоторое время на то, чтобы сделать наши типы документов совместимыми с 6.x, поскольку в этой версии мы больше не можем иметь несколько типов документов в одном индексе.

5. Я пытаюсь вспомнить, когда именно это было исправлено… Я обновлю здесь, как только найду… Он был представлен здесь