在 elasticsearch-ruby 中使用 percolate 进行批量索引

Posted

技术标签:

【中文标题】在 elasticsearch-ruby 中使用 percolate 进行批量索引【英文标题】:Using percolate for bulk indexing in elasticsearch-ruby 【发布时间】:2015-09-17 14:48:27 【问题描述】:

根据this issue,elasticsearch 支持使用带有索引(单个文档)或批量(多个文档)的渗透。没有给出批量的例子,所以我按照问题的标题来说明这个功能是 5 年前添加的。

很遗憾,我在 ruby​​ API elasticsearch-ruby 中找不到有关此功能的任何信息。

有人知道它是否可用,或者有代码示例吗?

谢谢。

更新:

This page 描述了如何在索引单个文档时进行渗透,并声称可以批量处理。现在,如何在 elasticsearch-ruby 中做到这一点?

看起来 NEST library 可以做到(见页面底部),如果我想在 .Net 中重写我的项目。

【问题讨论】:

这可能会有所帮助。 ***.com/questions/29427121/… @ManjitKumar,谢谢,但他们甚至没有索引文档,更不用说批量索引了...... 正如 Andrei 所说,自 1.0 以来,您无法一步索引和渗透文档。该文件的链接是从 2011 年开始的,从那以后发生了很多变化。 NEST 库可能会为您提供一个可能使用批量结果的包装器,然后过滤索引文档。 很遗憾功能消失了。 【参考方案1】:

除了a simple _bulk operation 指定_index 作为索引和_type 指定.percolator 之外,Ruby 中不应该有任何特殊方法:

POST /_bulk
"index":"_index":"some_index","_type":".percolator","_id":"1"
"query":"match":"whatever_field":"some value 1"
"index":"_index":"some_index","_type":".percolator","_id":"2"
"query":"match":"whatever_field":"some value 2"
"index":"_index":"some_index","_type":".percolator","_id":"3"
"query":"match":"whatever_field":"some value 3"

为了发送多个渗透请求,mpercolate 最初是作为percolate in bulk feature request 的结果创建的,最终被称为multi percolate api。而且我看到 elasticsearch-ruby 有 support 。

bulk?percolate=* 功能似乎不在list of arguments for _bulk 中,事实上,为此存在一个问题:github.com/elastic/elasticsearch-ruby/issues/176。

后期编辑:我再次查看了这个,我更倾向于相信这个特性已经在 ES 1.0.0 中完全删除,遵循the percolator redesign github 问题。我没有看到关于这个被删除的具体声明,但是在重新设计之后的source code related to bulk indexing with percolator option已被删除。此外,文档没有在任何地方指定此选项。通常,发生这种情况不是疏忽,而是功能根本不存在。仍然与文档相关 - 不要忘记您在网上找到的任何关于此的资源至少有两年的历史,我会在假设它们仍然有效之前对它们持保留态度。

如果您使用 curl 或 Sense 在 Elasticsearch(没有 ruby​​、nest 或任何客户端)中测试它并发现它不起作用,我不会感到惊讶。我刚刚在 1.6 中对此进行了测试,但没有看到该功能。

【讨论】:

我认为 .percolator 类型是存储渗透查询的地方。我不是在尝试批量创建过滤查询,而是批量索引文档并在响应中将过滤结果返回给我(因为当您索引单个文档)。如果我在您的回答中遗漏了什么,请详细说明。 哦,反过来。更新了我的答案。 percolate 用于发送文档(或现有文档的 id)进行渗透,而不是用于索引和一步渗透。 那我不明白你在找什么。 "localhost:9200/twitter/tweet/1?percolate=*" 将通过 curl 在同一步骤中索引和渗透一个文档。我想索引和渗透 ruby 中的 bulk 文档。 (感谢您的关注!)【参考方案2】:

latest master documentation(当前未发布的 Elasticsearch 6.x)有一个关于渗透多个文档的部分。这是计划在 6.X 中发布的新功能,但不在 6.0 候选版本中。

【讨论】:

以上是关于在 elasticsearch-ruby 中使用 percolate 进行批量索引的主要内容,如果未能解决你的问题,请参考以下文章

在 Observable RxSwift 中使用 'asPromise()' 可以在 PromiseKit Promise 中使用吗?

可以在 SELECT 查询中使用 IF() 但不能在 UPDATE 中使用

如何在 Python 中使用 kivy 在 TabeedPanel 中使用 GridLayout

Vue3中使用Pinia

为啥不能在视图中使用它,因为它在控制器中使用?

如何在 initstate() 中读取和使用共享偏好值?我可以在其他小部件中读取和使用值,但不能在我在 initstate 中调用的 API 中读取和使用值