批量和滚动助手编辑

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)

有两种方法可以使用助手从滚动获取结果。

  1. 您可以使用 Enumerable 中的方法(例如 eachmap)迭代滚动

    scroll_helper.each do |item|
      puts item
    end
  2. 您可以使用 results 函数按页获取结果

    my_documents = []
    while !(documents = scroll_helper.results).empty?
      my_documents << documents
    end
    scroll_helper.clear