我正在尝试如何在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>"]
参考: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重复此操作,直到没有响应响应。