批量和滚动助手
编辑批量和滚动助手编辑
Elasticsearch Ruby 客户端包含批量和滚动助手,用于更有效地处理结果。
批量助手编辑
Elasticsearch 中的批量 API 允许您通过单个 API 调用执行多个索引或删除操作,从而减少开销并提高索引速度。操作在请求正文中使用换行符分隔的 JSON (NDJSON) 结构指定。在 Elasticsearch Ruby 客户端中,bulk
方法支持多种数据结构作为参数。您可以以惯用的方式使用批量 API,而无需担心有效负载格式。有关更多信息,请参阅批量请求。
BulkHelper 在使用批量 API 时提供了更好的开发者体验。最简单地说,您可以向其发送数组中的一组哈希值,它会将它们批量摄取到 Elasticsearch 中。
要使用 BulkHelper,请在代码中 require 它
require 'elasticsearch/helpers/bulk_helper'
使用客户端和索引实例化 BulkHelper
client = Elasticsearch::Client.new bulk_helper = Elasticsearch::Helpers::BulkHelper.new(client, index)
此助手作用于您在初始化期间传入的索引,但您可以在代码中的任何时候更改索引
bulk_helper.index = 'new_index'
如果要索引文档集合,请使用 ingest
方法
documents = [ { name: 'document1', date: '2024-05-16' }, { name: 'document2', date: '2023-12-19' }, { name: 'document3', date: '2024-07-07' } ] bulk_helper.ingest(documents)
如果您要摄取大量数据,并且希望在将文档发送到 Elasticsearch 之前将它们分成较小的部分,请使用 slice
参数。
bulk_helper.ingest(documents, { slice: 2 })
这样,数据将通过两个不同的批量请求发送。
您还可以将要发送到批量 API 的参数包含在查询参数或请求正文中。方法签名为 ingest(docs, params = {}, body = {}, &block)
。此外,可以使用块调用该方法,该块将提供对从调用批量 API 接收到的响应对象和请求中发送的文档的访问权限
helper.ingest(documents) { |_, docs| puts "Ingested #{docs.count} documents" }
您也可以使用 BulkHelper 更新和删除文档。要删除一组文档,您可以发送文档 ID 数组
ids = ['shm0I4gB6LpJd9ljO9mY', 'sxm0I4gB6LpJd9ljO9mY', 'tBm0I4gB6LpJd9ljO9mY', 'tRm0I4gB6LpJd9ljO9mY', 'thm0I4gB6LpJd9ljO9mY', 'txm0I4gB6LpJd9ljO9mY', 'uBm0I4gB6LpJd9ljO9mY', 'uRm0I4gB6LpJd9ljO9mY', 'uhm0I4gB6LpJd9ljO9mY', 'uxm0I4gB6LpJd9ljO9mY'] helper.delete(ids)
要更新文档,您可以发送文档数组及其各自的 ID
documents = [ {name: 'updated name 1', id: 'AxkFJYgB6LpJd9ljOtr7'}, {name: 'updated name 2', id: 'BBkFJYgB6LpJd9ljOtr7'} ] helper.update(documents)
摄取 JSON 文件编辑
BulkHelper
还提供了一个助手,可以直接从 JSON 文件摄取数据。通过提供文件路径作为输入,助手将解析文件中的文档并将其摄取
file_path = './data.json' helper.ingest_json(file_path)
如果要摄取的数据数组不一定位于 JSON 文件的根目录中,则可以提供访问数据的键,例如,给定以下 JSON 文件
{ "field": "value", "status": 200, "data": { "items": [ { "name": "Item 1", (...) }, { (...) ] } }
以下是摄取上述 JSON 中的文档的 Ruby 代码示例
bulk_helper.ingest_json(file_path, { keys: ['data', 'items'] })
滚动助手编辑
此助手提供了一种从滚动获取结果的简单方法。
要使用 ScrollHelper,请在代码中 require 它
require 'elasticsearch/helpers/scroll_helper'
使用客户端、索引和正文(包含滚动 API 参数)实例化 ScrollHelper,这些参数将在每个后续滚动请求中使用
client = Elasticsearch::Client.new scroll_helper = Elasticsearch::Helpers::ScrollHelper.new(client, index, body)
有两种方法可以使用助手从滚动获取结果。
-
您可以使用
Enumerable
中的方法(例如each
和map
)迭代滚动scroll_helper.each do |item| puts item end
-
您可以使用
results
函数按页获取结果my_documents = [] while !(documents = scroll_helper.results).empty? my_documents << documents end scroll_helper.clear