两个Elasticsearch7索引查询结果排序不一致问题咨询
问题描述
我有两个Elasticsearch7索引,存储的文档内容完全一致,仅文档的_id不同。执行如下查询语句:
{"query": {"bool": {"must": [{"bool": {"must": [{"match": {"distretto": "MI"}}], "should": []}}], "should": []}}, "_source": ["annosentenza", "cf_giudice", "codiceoggetto", "controparte", "id", "nomegiudice", "parte", "text"]}
仅查询distretto为MI的内容时:
civile索引首页结果:- eDmNh38BgYGzAMbAifcN -> MI 111002 CIGOLINI CHIARA
- 2jmNh38BgYGzAMbAlfcv -> MI 230999 INPS
paganotti_civile索引首页结果:- 98WLpIQBAcCrPawmBF_o -> MI 140112 SODALITAS SOC. COOP. SOCIALE ONLUS
- -MWLpIQBAcCrPawmBV8M -> MI 140022 AM CASALI S.R.L.
我期望paganotti_civile索引返回与civile索引相同的首页结果。以下是两个索引的查询响应详情:
第一个索引(civile)查询响应
{ "took" : 3, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 10000, "relation" : "gte" }, "max_score" : 2.7262077, "hits" : [ { "_index" : "civile", "_type" : "_doc", "_id" : "eDmNh38BgYGzAMbAifcN", "_score" : 2.7262077, "_source" : { "codiceoggetto" : "111002", "controparte" : "CIGOLINI CHIARA", "nomegiudice" : "BONIOLO FLAVIANA", "annosentenza" : "", "cf_giudice" : "BNLFVN76A56F205I", "parte" : "ARCAINI GIUSEPPE", "id" : "GLMI 87088946 123646" } }, { "_index" : "civile", "_type" : "_doc", "_id" : "2jmNh38BgYGzAMbAlfcv", "_score" : 2.7262077, "_ignored" : [ "text.keyword" ], "_source" : { "codiceoggetto" : "230999", "controparte" : "INPS", "nomegiudice" : "FEDELE EMANUELA", "annosentenza" : "", "cf_giudice" : "FDLMNL64D52B300E", "parte" : "CIFALDI NICOLA", "id" : "GLMI 99957367 27427" } }, { "_index" : "civile", "_type" : "_doc", "_id" : "ATmNh38BgYGzAMbAmfhY", "_score" : 2.7262077, "_ignored" : [ "text.keyword" ], "_source" : { "codiceoggetto" : "220050", "controparte" : "ROMEO GESTIONI SPA", "nomegiudice" : "FEDELE EMANUELA", "annosentenza" : "", "cf_giudice" : "FDLMNL64D52B300E", "parte" : "RISI LORENA", "id" : "GLMI 98349767 27599" } }, { "_index" : "civile", "_type" : "_doc", "_id" : "LTmNh38BgYGzAMbAnvgM", "_score" : 2.7262077, "_ignored" : [ "text.keyword" ], "_source" : { "codiceoggetto" : "144032", "controparte" : "BALDINI ILEANA", "nomegiudice" : "ROCA GRAZIA CONCETTA", "annosentenza" : "", "cf_giudice" : "RCOGZC84P50D643J", "parte" : "P.C.E. PRODUZIONE CABLAGGI ELETTRICI S.R.L.", "id" : "GLMI 75594601 109890" } }, { "_index" : "civile", "_type" : "_doc", "_id" : "hzmNh38BgYGzAMbAqPjU", "_score" : 2.7262077, "_ignored" : [ "text.keyword" ], "_source" : { "codiceoggetto" : "220040", "controparte" : "COMUNE OGGIONA CON SANTO STEFANO", "nomegiudice" : "FEDELE EMANUELA", "annosentenza" : "", "cf_giudice" : "FDLMNL64D52B300E", "parte" : "MAGISTRI MARCO EMILIO", "id" : "GLMI 100942914 26946" } } ] } }
第二个索引(paganotti_civile)查询响应
{ "took" : 138, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 10000, "relation" : "gte" }, "max_score" : 0.4119706, "hits" : [ { "_index" : "paganotti_civile", "_type" : "_doc", "_id" : "98WLpIQBAcCrPawmBF_o", "_score" : 0.4119706, "_ignored" : [ "text.keyword" ], "_source" : { "codiceoggetto" : "140112", "controparte" : "SODALITAS SOC. COOP. SOCIALE ONLUS", "nomegiudice" : "PERTILE ROBERTO", "annosentenza" : "", "cf_giudice" : "PRTRRT58A14L872W", "parte" : "RANZANI GIUSEPPINA", "id" : "GLMI 100944044 1964905" } }, { "_index" : "paganotti_civile", "_type" : "_doc", "_id" : "-MWLpIQBAcCrPawmBV8M", "_score" : 0.4119706, "_ignored" : [ "text.keyword" ], "_source" : { "codiceoggetto" : "140022", "controparte" : "AM CASALI S.R.L.", "nomegiudice" : "CAPPELLO ADA", "annosentenza" : "", "cf_giudice" : "CPPDAA87T59C351D", "parte" : "BOSSI GIANCARLO", "id" : "GLMI 75970798 113201" } }, { "_index" : "paganotti_civile", "_type" : "_doc", "_id" : "-cWLpIQBAcCrPawmBV8g", "_score" : 0.4119706, "_ignored" : [ "text.keyword" ], "_source" : { "codiceoggetto" : "140051", "controparte" : "BUCCI GIORGIO", "nomegiudice" : "FERRARI FRANCESCO MATTEO", "annosentenza" : "2021", "cf_giudice" : "FRRFNC67M20F205B", "parte" : "POZZA OTTAVIANO ALVISE", "id" : "GLMI 135138291 2299283" } }, { "_index" : "paganotti_civile", "_type" : "_doc", "_id" : "-sWLpIQBAcCrPawmBV81", "_score" : 0.4119706, "_ignored" : [ "text.keyword" ], "_source" : { "codiceoggetto" : "140041", "controparte" : "DI LAURO GENNARO (AVV.)", "nomegiudice" : "RAINERI CARLA ROMANA", "annosentenza" : "2020", "cf_giudice" : "RNRCLR55E52G535U", "parte" : "MONTE DEI PASCHI DI SIENA SPA", "id" : "GLMI 101233632 100541" } }, { "_index" : "paganotti_civile", "_type" : "_doc", "_id" : "-8WLpIQBAcCrPawmBV9D", "_score" : 0.4119706, "_ignored" : [ "text.keyword" ], "_source" : { "codiceoggetto" : "140022", "controparte" : "CO.GE.T. SOCIETA COOPERATIVA IN LIQUIDAZIONE", "nomegiudice" : "MANTOVANI ANNA", "annosentenza" : "2021", "cf_giudice" : "MNTNNA58A68F205S", "parte" : "AMIACQUE SRL", "id" : "GLMI 131465321 114225" } } ] } }
请问为何两个索引返回结果排序不同,如何让paganotti_civile索引返回与civile索引相同的首页结果?
问题分析与解决方案
排序差异原因
- 评分计算不一致:从响应数据可见,
civile索引内所有匹配文档的评分均为2.7262077,而paganotti_civile的匹配文档评分都是0.4119706。这说明两个索引的字段映射或分词器设置存在差异,比如distretto字段在civile中是keyword类型(精确匹配,评分更高),在paganotti_civile中是text类型(分词匹配,评分更低),导致相同查询下的匹配度计算结果不同。 - 默认排序逻辑影响:当多个文档评分相同时,Elasticsearch会默认以文档
_id作为排序依据。由于两个索引的_id完全不同,即使评分一致,最终返回的排序也会出现差异。
解决方案
要让paganotti_civile返回与civile一致的首页结果,可从以下两个方向处理:
1. 统一索引映射与分词设置
检查civile索引的字段映射(尤其是distretto字段),将paganotti_civile的映射调整为完全一致的配置。调整完成后需要重新索引数据,确保两个索引对字段的处理逻辑相同,这样查询时的评分计算结果才能统一。
2. 指定明确的排序规则
如果无法修改索引配置,可直接在查询中指定统一的排序字段,替代默认的「评分+_id」排序逻辑。选择两个索引中对应文档值完全一致的字段(比如响应中的id字段)进行排序:
修改后的查询语句示例:
{ "query": { "bool": { "must": [ { "bool": { "must": [{"match": {"distretto": "MI"}}], "should": [] } } ], "should": [] } }, "_source": ["annosentenza", "cf_giudice", "codiceoggetto", "controparte", "id", "nomegiudice", "parte", "text"], "sort": [ {"id": "asc"} ] }
这样无论评分和_id如何,都会按照id字段的顺序返回结果,确保两个索引的首页结果一致。如果id字段不适合排序,也可以选择其他内容一致的字段(如codiceoggetto)或多字段组合排序,只要保证对应文档的字段值完全相同即可。
内容的提问来源于stack exchange,提问作者zabitstack
相关产品推荐
相关产品推荐

