批量和滚动助手
编辑批量和滚动助手
编辑Elasticsearch Ruby 客户端包含批量和滚动助手,以便更高效地处理结果。
批量助手
编辑Elasticsearch 中的批量 API 允许您通过单个 API 调用执行多个索引或删除操作,从而减少开销并提高索引速度。操作在请求正文中以换行符分隔的 JSON (NDJSON) 结构指定。在 Elasticsearch Ruby 客户端中,bulk
方法支持多种数据结构作为参数。您可以以惯用的方式使用批量 API,而无需担心有效负载格式。有关更多信息,请参阅 批量请求。
使用批量 API 时,批量助手提供了更好的开发人员体验。最简单的情况是,您可以将哈希集合作为数组发送给它,它会将它们批量导入到 Elasticsearch 中。
要使用批量助手,请在代码中引入它
require 'elasticsearch/helpers/bulk_helper'
使用客户端和索引实例化批量助手
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" }
您也可以使用批量助手更新和删除文档。要删除一组文档,可以发送文档 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'] })
滚动助手
编辑此助手提供了一种从滚动获取结果的简便方法。
要使用滚动助手,请在代码中引入它
require 'elasticsearch/helpers/scroll_helper'
使用客户端、索引和一个正文(包含滚动 API 参数)实例化滚动助手,该正文将用于每个后续滚动请求
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