【问题标题】:Search After (pagination) in Elasticsearch when sorting by score按分数排序时在 Elasticsearch 中搜索之后(分页)
【发布时间】:2019-12-29 17:53:00
【问题描述】:

在 elasticsearch 中的 search after 必须在 count 和 order 上匹配其排序参数。所以我想知道如何从以前的结果(示例第 1 页)中获取分数,以将其用作下一页之后的搜索。 在之前的搜索中使用最后一个文档的分数时,我遇到了一个问题。分数为 1.0,由于所有文档的分数均为 1.0,因此下一页的结果结果为 null(空)。

这实际上是有道理的,因为我向 elasticsearch 询问排名(分数)低于 1.0 且为零的结果,所以我使用哪个分数来获取下一页。

注意: 我按分数排序,然后按 TieBreakerID 排序,因此一种可能的解决方案是使用高值(例如 1000)作为分数。

【问题讨论】:

  • 为什么不能使用from参数在offset处得到结果?
  • 出于性能原因,我的情况下不能使用 from 和 size,根据此文档:elastic.co/guide/en/elasticsearch/reference/current/…
  • 您确定按分数搜索会更快吗?另外,请注意,根据文档,分数是不可重现的(假设没有解决方法)。这意味着您的方法可能行不通。 elastic.co/guide/en/elasticsearch/reference/current/…
  • 我完全同意丹尼斯的观点,每个请求的分数可能不同,这使得它作为搜索后参数不可靠。那么在按相关性排序时,您建议使用什么进行分页?
  • 这取决于您的用例。在搜索中,很少需要查看前几页。如果您不看前几页,“发件人”就可以了。看看 Scroll API,它允许您有效地遍历整个数据集。请注意,保持滚动上下文活动的成本很高,因此它并不是真正用于分页,更多的是用于迭代。但是,您可以使用滚动 api 将结果缓存到您的应用程序吗?除此之外,我认为没有其他支持的方法。如果这不能解决您的用例,请告诉我。

标签: elasticsearch search


【解决方案1】:

你正在做的事情听起来应该可以工作,就像explained by an Elastic team member。它适用于我(在 ES 7.7 中),即使在使用文档 ID(复制到另一个索引字段)作为决胜局时得分相同。确实,在分页时对其他文档进行索引会使您的分数稍微不稳定,但不足以对最终用户造成严重问题。如果您需要它对批处理作业可靠,则 Scroll API 是更好的选择。

{
    "query": {
        ...
    },
    "search_after": [
        12.276552,
        14173
    ],
    "sort": [
        { "_score": "desc" },
        { "id": "asc" }
    ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多