elasticsearch - 在 Elasticsearch 中通过 id 获取上一个/下一个搜索结果的通用方法

标签 elasticsearch

假设我的索引中有一百万(很多)个文档。我执行一个搜索查询,按某个键 X 对项目进行排序。

现在我有一个很长的结果列表:[..., id1, id2, id3, ...]
问题:我如何获得id1id3如果我知道 id2但不想执行整个搜索/不想获取所有 ID?

我正在寻找适用于任何搜索查询的通用解决方案。给定一个在查询结果中肯定存在的 id,如何通过该 id 获取上一个/下一个。除了搜索上一个/下一个的 id 之外,查询不应该有其他任何东西的先验知识。 (换句话说,如果按标题排序并搜索 id X 的 prev/next,则在查询时不知道 X 的标题,只有 X 的 id。)

当然可以通过获取 id2 来执行多个搜索查询并获得相同的最终结果。然后通过排序来获取 ID 1 和 3。

编辑:
我认为 Luc E 的答案不是我想要的。在这种情况下,需要了解原始对象标题才能查询上一个/下一个。我正在寻找一种在查询时只知道 id 的解决方案。

示例数据如下所示:

[...
{id: 32, title: 'AAA'},
{id: 12, title: 'BBB'},
{id: 99, title: 'CCC'},
{id: 3, title: 'DDD'},
{id: 1001, title: 'EEE'},
...]

我知道的:id 99。我不知道的:id 99 的标题是什么。
我想要的是:按标题字段(= 3 和 12)排序的上一个/下一个项目的 ID。

换句话说:我有 99 号 ID,但我手上没有标题。我想要一个给我 ids 3 和 12 的查询(它们是按标题排序的上一个/下一个)。

最佳答案

你想做的叫deep scrolling ,你只有两种方法可以做到:

  • scroll
  • search_after

  • 最简单的方法是search_after但您需要提出两个请求:
  • 一个请求 id3
  • 另一个给 id1

  • 所以,在这个例子中,我正在寻找 id2 : 128 .我可以使用字段 title 对文档进行排序我事先得到了 title 的值为 id2这是 title_of_128 .

    执行 search_after ,我必须添加_id在子排序条件下

    这是我的查询:
    POST test/_search
    {
      "size": 2,
      "search_after": ["title_of_128","128"],
      "sort": [
        {
          "title": {
            "order": "asc"
          },
          "_id": {
            "order": "asc"
          }
        }
      ]
    }
    

    此查询的结果是 id2id3
    现在我反转排序的方向以检索 id1 :
    POST test/_search
    {
      "size": 2,
      "search_after": ["title_of_128","128"],
      "sort": [
        {
          "title": {
            "order": "desc"
          },
          "_id": {
            "order": "desc"
          }
        }
      ]
    }
    

    此查询的结果是 id2id1
    注意用 _id 排序已弃用,最佳做法是复制 _id如果您想使用 search_after 在另一个字段中

    关于elasticsearch - 在 Elasticsearch 中通过 id 获取上一个/下一个搜索结果的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60815459/

    相关文章:

    elasticsearch - ElasticSearch限制过滤器歧义

    elasticsearch - 在ElasticSearch中的嵌套对象数组上应用 'exists'查询

    elasticsearch - 需要在文档内部数组对象上聚合-ElasticSearch

    linux - Elasticsearch 7.6 监听环回地址但不监听服务器 IP

    java - 扩展统计Elasticsearch标准差总体或样本?

    java - 如何将JSON数据存储在Arraylist中?

    amazon-web-services - AWS Managed elastic Search 恢复 - 节点与索引设置不匹配

    c# - NEST C# - elasticsearch - 电子商务过滤器组合

    ruby-on-rails - Elasticsearch + 轮胎 : good strategy to mock ES

    ElasticSearch进入 "read only"模式,节点无法更改