获取与类型1匹配但不在类型2中的文档

时间:2017-10-06 05:19:46

标签: elasticsearch

我有一个索引结构,其中类型是日期,每种类型都有几个文档。我希望所有文档都存在于类型1中,但必须在类型2中不存在。举个例子:

Type-1 ---> id list = [1,2,3,4,5,6]
Type-2 ---> id list = [2,3,7,8,9]

我正在寻找的查询应返回类型1的文档,只有id = [1,4,5,6] 我正在使用es-py客户端来实现上述目的。

PS:我总是可以获得匹配type-1和type-2的文档,然后迭代它们以获得我需要的东西。但这是我想要避免性能的解决方案。

1 个答案:

答案 0 :(得分:1)

我的第一个想法是,你的问题是关于两种类型的文件集的差异(减法)。但正如您所提到的,您不能在两种类型中使用相同的文档,而是在两个文档中使用相同的ID (_uid = _type#_id)

所以你的问题是join-Query: 您需要类型1中所有_id-Values的补充,它也属于类型-2。

您可以使用Parent-Child-Relationship,但在这种情况下,您必须更改索引 - 流程。

不幸的是,在elasticsearch中两种类型之间没有其他“内置”连接(例如solr会帮助)。

您可以通过聚合从连接中获取所有ID,并在没有elasticsearch的情况下构建补充,但这仅适用于类型1的小型集。

因此,从我的观点来看,您需要构建自己的搜索插件,类似于ParentJoinPlugin

起点是: https://github.com/elastic/elasticsearch/blob/v5.6.2/modules/parent-join/src/main/java/org/elasticsearch/join/query/HasParentQueryBuilder.java

但请注意:如果type-1的文档属于其他分片,则输入-2即使使用自己的SearchPlugin也无法加入。