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 排序索引无法按预期使用多个分片的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 列表索引按名称排序

ElasticSearch嵌套查询无法按预期工作

CUDA 索引无法按预期工作

使用 query.limit 对 Parse 的结果进行排序无法按预期工作

如果状态为真,则 Elasticsearch bool 查询按日期排序

在移动设备上使用可排序的触摸事件 + jquery-ui 无法按预期工作