为何Elasticsearch 2.3与8.9版本相同查询返回结果存在差异?
相同查询语句在Elasticsearch 2.3和8.9中返回结果差异的原因分析
在Elasticsearch 2.3和8.9版本中执行完全相同的查询语句,返回结果却存在显著差异,具体情况如下:
Elasticsearch 8.9 版本查询与结果
查询语句
GET /lems/_search {"size":0,"query":{"bool":{"must":[{"match":{"c_id":{"query":"3M"}}},{"range":{"e_date":{"gte":"09/08/2023","format":"MM/dd/yyyy"}}}]}},"aggregations":{"w_code":{"terms":{"field":"w_code","size":1000}}}}
查询结果
{ "took": 11, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1704, "relation": "eq" }, "max_score": null, "hits": [] }, "aggregations": { "w_code": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "P", "doc_count": 934 }, { "key": "Y", "doc_count": 6 } ] } } }
Elasticsearch 2.3 版本查询与结果
查询语句
GET /lems/_search {"size":0,"query":{"bool":{"must":[{"match":{"c_id":{"query":"3M"}}},{"range":{"e_date":{"gte":"09/08/2023","format":"MM/dd/yyyy"}}}]}},"aggregations":{"w_code":{"terms":{"field":"w_code","size":1000}}}}
查询结果
{ "took": 6, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 284660, "max_score": 1.0, "hits": [ { "_index": "lems", "_type": "al", "_id": "3M466", "_score": 1.0, "_source": { "c_id":"3M", "w_code":"E", "e_code": null, "a_id": "1Y01", "e_date": "09/08/2023" } } ] } }
结果差异的核心原因
- 字段映射与分词逻辑差异:两个版本的
lems索引字段映射大概率不同。比如c_id字段在2.3版本可能是文本类型,分词后会匹配包含"3"或"M"的文档,导致命中数极高;而8.9版本中c_id可能被设为keyword类型,仅精确匹配"3M",所以命中数大幅减少。 - 日期解析规则变化:从2.x到8.x,Elasticsearch对日期格式的解析更严格。2.3版本可能对
MM/dd/yyyy格式的匹配比较宽松,甚至接受非标准格式的日期值;8.9版本则严格校验格式,只返回符合要求的文档。 - 数据集或索引同步问题:两个版本的
lems索引可能并非同一套数据,或者数据同步不完整,导致文档本身存在巨大差异。 - size参数处理逻辑差异:查询里明确设置了
size:0,但2.3版本仍返回了一条hit数据,这是旧版本的参数处理bug或逻辑差异,8.9版本则严格遵守size:0的规则不返回具体文档。 - 聚合功能的版本特性:2.3版本的查询包含聚合配置,但结果里未返回聚合数据,这可能是旧版本的功能限制或查询执行异常;而8.9版本正常返回了聚合结果,且基于的是精确匹配后的文档集,所以和2.3版本的结果完全无关。
内容的提问来源于stack exchange,提问作者Ajay Takur
相关产品推荐
相关产品推荐

