ElasticSearch - 并行 PIT 搜索 + search_after

问题描述 投票:0回答:1

我正在尝试如何在ElasticSearch 7.10.2中进行PIT搜索+search_after。

我从 ES 中获取 3000 万行,每页 100K。获取一页大约需要 1.5 分钟。这太慢了,我想并行执行它,就像在 Oracle 数据库中我们可以

dbms.execute_parallel_task
。我提到这一点是因为我正在使用此过程从 Oracle DB 获取数据,并与我将从 ES 获取的数据进行比较。在数据库方面,由于这个过程,我可以在 1 分钟内以 20 的并行级别获取相同数量的数据。我在想是否可以在 ES 中完成类似的操作。

问题是,

search_after
似乎被认为是一个命令,在知道下一个
sort
之前,你无法开始另一个块。有什么办法可以解决这个问题吗?谢谢。

在 Oracle 中,我按 ID 列对表进行分块,该列是

NUMBER
并已建立索引。 (参见这个问题和我的答案)。在 ES 中,我没有
ID
,但我有
FIELD1
,它也是
_id
,我需要按
_id
排序。我不按
FIELD1
排序的原因是因为我不能,它不是
keyword
并且我无法更改此索引的定义。

FIELD1
是一个字符串,但仅由15位数字组成。

我的 ES 查询如下所示:

{
  "query": {
    "wildcard": {
      "companyId": {
        "value": "40*"
      }
    }
  },
  "fields":[
        "FIELD1", "FIELD2"
  ],
  "sort": {"_id": "asc"},
  "size": 100000,
  "_source": false,
  "pit": {
        "id": "<a very long id>",
        "keep_alive": "1m"
  },
  "track_total_hits": false
}

和 2..n 查询将添加

search_after: ["FIELD1": "<last hit value of FIELD1>"]

elasticsearch point-in-time
1个回答
0
投票

参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/scan-scroll.html

#1 划分数据集 根据(如 _id 范围)手动分区数据

{
  "size": 0,
  "aggs": {
    "my_buckets": {
      "composite": {
        "size": 10000,
        "sources": [
          {
            "id": {
              "terms": {
                "field": "_id"
              }
            }
          }
        ]
      }
    }
  }
}

#2 实现并行滚动/搜索 在代码中并行运行多个滚动查询。

第一个分区(例如 ID 0 到 99999) (根据需要增加时间)

POST /this_index/_search?scroll=5m
{
  "size": 10000,
  "query": {
    "range": {
      "_id": {
        "gte": "0",
        "lt": "1000000"
      }
    }
  }
}

获取第一组批次

POST /_search/scroll
{
  "scroll": "5m", 
  "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAA..."
}

对每个分区的scroll_id重复此操作,直到没有响应响应。

© www.soinside.com 2019 - 2024. All rights reserved.