我们正在将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语法中工作(向后兼容性是一个显而易见的问题,因为我们有一些系统使用这种语法,而我们现在无法重构这种语法。)
暂无答案!
目前还没有任何答案,快来回答吧!