#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, и тот же запрос все еще работает там.
Обновление: еще немного информации.
Если мы выполним запрос диапазона в теле 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. Я пытаюсь вспомнить, когда именно это было исправлено… Я обновлю здесь, как только найду… Он был представлен здесь