插入文档时是否可以从过滤器获取响应?

时间:2014-01-06 22:02:58

标签: elasticsearch

在搜索允许我在插入数据时触发某些操作的解决方案时,我发现了来自elasticsearch的percolator API。在我发现使用percolator API的所有查询都在使用GET之前,我已阅读了不少页面。

对于插入文档的用例并且想要知道哪些与查询匹配,我需要做两个请求吗?从页面中我得到的印象是我必须首先插入文档,然后询问percolator索引是否匹配相同的文档。或者是否有一个查询参数或类似的让弹性搜索包含过滤器对从插入中获得的响应的响应?

2 个答案:

答案 0 :(得分:7)

鉴于您的问题,我相信您正在关注Beta2中可用的弹性搜索1.0。这个细节非常重要,因为过滤器已经在1.0中重写,与0.90中可用的相比看起来完全不同。

您通常使用过滤器来注册存储的查询。然后,您可以渗透文档以了解它匹配的查询数量,而无需实际编制索引。

许多人需要的是索引文档的附加步骤,因此能够在同一个请求中进行渗透和索引很好,这样您就可以索引文档并获取它的查询火柴。在索引时使用所谓的渗透物在0.90中曾经是可能的。它是唯一一个通过重写为1.0删除的功能,以便能够更好地分发已注册的查询并将其缩小。

实际上,使用0.90时,查询存储在一个名为_percolator的保留索引中,该索引始终有1个分片,auto_expand_replica设置为true。这意味着每个节点都将包含所有查询,因为单个分片将自动复制到所有节点。这背后的主要原因是,当您想要同时索引文档并进行渗透时,为了以一种执行方式执行此操作,您需要确保需要命中的两个分片(查询和数据)是在同一节点上。如果所有查询都在所有节点上,那么这可以保证渗透,同时可以进行索引并且足够快。但是有一个很大的限制,这就是为什么过滤器被重写了:你可以注册的查询数量有限,因为它们将放在一个分片中。

使用1.0,您可以针对任何索引注册查询,并且它们将在名为.percolator的保留类型下注册。然后,您也可以使用查询进行扩展,因为它们位于普通索引中,您可以定义分片数。缺点是您没有在每个节点上拥有查询的完整副本,因此在无法建立索引时进行渗透。你能做什么,相当于两个请求,包括:

  1. 索引文档
  2. percolate the existing document按ID,无需再次发送整个文档
  3. 步骤2可以在索引操作返回后立即完成,因为它在内部执行get by id,它可以实时工作,因此无需等待或刷新索引。

答案 1 :(得分:0)

我相信这是不可能的。

来自the documentation ..

  

保存已注册查询存储库的_percolator只是ES中的另一个索引。

由于percolator是另一个索引,因此需要使用另一个针对_percolator的查询作为索引来命中ES。