Elasticsearch 扫描和滚动 - 添加到新索引

Elasticsearch scan and scroll - add to new index

Elasticsearch 和命令行编程菜鸟问题。

我在我的计算机上本地设置了 elasticsearch,并希望使用扫描和滚动 api 从使用不同版本 es 的服务器中提取文档,并将它们添加到我的索引中。我无法弄清楚如何使用 es 的批量 api 执行此操作。

现在在我的测试阶段,我只是使用以下代码(有效)从服务器中提取一些文档:

   http MY-OLD-ES.com:9200/INDEX/TYPE/_search?size=1000 | jq   .hits.hits[] -c | while read x; do id="`echo "$x" | jq -r ._id`"; index="`echo "$x" | jq -r ._index`"; type="`echo "$x" | jq -r ._type`"; doc="`echo "$x" | jq ._source`"; http put "localhost:9200/junk-$index/$type/$id" <<<"$doc"; done

关于扫描和滚动如何工作的任何提示(菜鸟和有点困惑)。到目前为止,我知道我可以滚动并获得滚动 ID,但我不清楚如何处理滚动 ID。 如果我打电话给

http get http://MY-OLD-ES.com:9200/my_index/_search?scroll=1m&search_type=scan&size=10

我会收到一个卷轴 ID。这可以通过管道输入并以相同的方式解析吗?此外,我相信我需要一个 while 循环来告诉它继续请求。我到底应该怎么做呢?

谢谢!

scan and scroll 文档解释得非常清楚。获得 scroll_id(一个长的 base64 编码字符串)后,将其与请求正文一起传入。使用 curl,请求看起来像这样:

curl -XGET 'http://MY-OLD-ES.com:9200/_search/scroll?scroll=1m' -d '
c2Nhbjs1OzExODpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExOTpRNV9aY1VyUVM4U0 
NMd2pjWlJ3YWlBOzExNjpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExNzpRNV9aY1Vy
UVM4U0NMd2pjWlJ3YWlBOzEyMDpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzE7dG90YW
xfaGl0czoxOw==
'

请注意,虽然第一个打开卷轴的请求是 /my_index/_search,但第二个读取数据的请求是 /_search/scroll。每次调用时,传递 ?scroll=1m 查询字符串,它会在自动关闭滚动之前刷新超时。

还有两点需要注意:

  1. 您在打开卷轴时传递的 size 适用于每个分片,因此您将 size 乘以每次请求时索引中的分片数。
  2. /_search/scroll 的每个请求都将 return 一个新的 scroll_id,您必须在下一次调用时传递该请求以获得下一批结果。你不能一直用相同的 scroll_id.
  3. 打电话

在滚动请求中没有命中 return 时完成。