ElasticSearch 排序索引无法按预期使用多个分片
Posted
技术标签:
【中文标题】ElasticSearch 排序索引无法按预期使用多个分片【英文标题】:ElasticSearch Sorted Index not working as expected with multiple shards 【发布时间】:2021-08-26 15:55:41 【问题描述】:我有一个带有默认价格排序映射的弹性索引:
shop_prices_sort_index
"sort" :
"field" : "enrich.price",
"order" : "desc"
,
如果我插入 10 个文档:
100, 98, 10230, 34, 1, 23, 777, 2323, 3, 109
并使用 /_search 获取结果。默认情况下,它按价格降序返回文档。
10230, 2323...
但是如果我将我的文档分配到 3 个碎片中,那么相同的查询会返回一些其他的产品序列:
100, 98, 34...
我真的被困在这里,我不确定我是否遗漏了一些基本的东西,或者我是否需要任何额外的设置才能使排序索引正常运行。
PS:我也尝试过“路由”和“偏好”。但没有运气。 非常感谢任何帮助。
【问题讨论】:
PS:我也尝试了不同的搜索类型:“Query Then Fetch”和“DFS Query Then Fetch”。他们都没有返回预期的结果。 【参考方案1】:配置index sorting 时,您只需确保每个分片内的每个段 都正确排序。索引排序的目标是提供一些more optimization during searches
由于 ES 的分布式特性,当您的索引有很多分片时,每个分片都会正确排序,但您的搜索查询仍需要显式使用排序。
因此,如果您的索引设置包含以下内容以在索引时应用排序
"sort" :
"field" : "enrich.price",
"order" : "desc"
您的搜索查询还需要在查询时包含相同的排序规范
"sort" :
"field" : "enrich.price",
"order" : "desc"
通过使用索引排序,您会在索引时遇到一些开销,但最终您的搜索查询会更快一些。
【讨论】:
如果我必须在每个搜索查询中指定排序,那么使用排序索引没有意义:) 我想使用排序索引的原因是,我的搜索查询返回一个排序的结果没有任何过滤器。为了在这里更有意义 - 我想将此排序索引与 function_score 一起使用。因此,当我使用 function_score 对文档进行排名时,我希望默认顺序基于此排序索引。这造成了一个问题,因为我相信的碎片。 首先,我认为您还没有阅读我链接到的博客文章,该文章解释了索引排序的全部内容。我认为您错过了索引排序的要点,其主要目标是在搜索时更快地搜索数据,而不必扫描整个段。其次,如果您使用 function_score 这意味着您想要影响分数,因此在这种情况下默认索引排序是无用的,因为它永远不会启动。您总是可以使用单个分片的索引(如果您有 是的,我确实了解索引排序的使用。但我正在尝试创造一些不同的东西,现在看起来像是一个大黑客。 - 使用 function_score,将 score_mode 作为“第一”,将 boost_mode 作为“替换”。这是我正在构建的功能的要求。在我使用 function_score 之前,我希望对默认顺序进行排序。例如,我可以给类别为 10 的产品打 100 分,但同时对这些匹配的产品按价格进行排序。我希望我能用更详细的例子来解释。但无论如何,作为一种解决方法,我使用了单个分片,到目前为止它似乎有效。以上是关于ElasticSearch 排序索引无法按预期使用多个分片的主要内容,如果未能解决你的问题,请参考以下文章
使用 query.limit 对 Parse 的结果进行排序无法按预期工作