search_after 在弹性搜索中如何工作?

2024-05-12

我一直在尝试在我们的应用程序中使用 Elasticsearch,但分页限制为 10k 对我们来说实际上是一个问题,并且由于必须超时问题,滚动 API 也不是推荐的选择。

我发现 Elasticsearch 有一个叫做 search_after 的东西,它是支持深度分页的理想解决方案。我一直试图从文档中理解它,但它有点令人困惑,并且无法清楚地理解它是如何工作的。

假设我的文档中有三列,id, first_name, last_name,这里的ID是唯一的主键。

{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "sort": [
        {"id": "asc"}      
    ]
}

我可以使用上面的查询来使用 search_after 功能吗?我在他们的文档中读到,我们必须在排序中使用多个唯一值,而不仅仅是一个(ID),但正如你所知,在我的数据集中我只有 ID 是唯一的。我可以做什么来将 search_after 用于我的数据集示例?

我无法理解所述问题,如果我使用一个独特的决胜局进行排序?有人可以帮忙用外行人的话解释一下吗?

https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-search-after.html

应使用每个文档具有唯一值的字段作为 排序规范的决胜局。否则排序顺序为 具有相同排序值的文档将是未定义的,并且可能 导致结果缺失或重复。 _id 字段具有唯一值 每个文档,但不建议将其用作决胜局 直接地。请注意,search_after 会查找第一个文档 完全或部分匹配决胜局提供的价值。因此如果一个 文档的决胜局值为“654323”,您在 search_after 中搜索 “654”它仍然会匹配该文档并返回找到的结果 在它之后。文档值在此字段上被禁用,因此对其进行排序 需要在内存中加载大量数据。相反,建议 复制(客户端或使用一组摄取处理器)的内容 启用并使用 doc 值的另一个字段中的 _id 字段 这个新字段作为排序的决胜局。


就你而言,如果你的id字段包含唯一值并且具有类型keyword(或数字)那么你绝对没问题,可以使用它来分页search_after.

因此,第一个电话将是您问题中的电话:

{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "sort": [
        {"id": "asc"},
        {"score": "desc"}      
    ]
}

在你的回复中,你需要查看最后一次点击并采取sort最后一次点击的值:

{
    "_index" : "myindex",
    "_type" : "_doc",
    "_id" : "100000012",
    "_score" : null,
    "_source": { ... },
    "sort" : [
      "100000012",                                <--- take this
      "98"                                        <--- take this
    ]
}

然后在下一次搜索调用中,您将在中指定该值search_after

{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "search_after": [ "100000012", "98" ],        <--- add this
    "sort": [
        {"id": "asc"}      
    ]
}

下一个结果集的第一个命中将是id: 100000013。就是这样。没有更多的事情了。

你所指出的问题与你无关如果你总是用 full 排序id values。它的工作原理是你总是使用最后一个id先前结果的值。如果你要添加"search_after": ["1000"]那么你就会遇到他们提到的问题,但你没有理由这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

search_after 在弹性搜索中如何工作? 的相关文章

随机推荐