批量和滚动助手

编辑

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)

使用助手可以通过两种方式从滚动中获取结果。

  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