2017-10-06 65 views
0

我有一個索引結構,其中類型是日期,每種類型都有幾個文檔。我想獲得所有類型1的文件,但是類型2中必須缺席。作爲一個例子:獲取匹配類型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:我總是可以獲得單獨匹配類型1和類型2的文檔,然後迭代遍歷它們以獲得我需要的內容。但這是我爲了表現而想避免的解決方案。

回答

1

我的第一個想法是,你的問題是關於兩種類型的文檔集的差異(減法)。但正如你所說,你不能有兩種類型同一文檔,但在兩個文件(_uid = _type#_id)

所以你的問題是關於一個join-Query同一ID: 您需要的所有_id值的互補型-1也屬於類型2。

你可以使用Parent-Child-Relationship這個,但在這種情況下,你必須改變你的索引過程。

不幸的是,在elasticsearch中兩種類型之間沒有其他「內建」連接(例如solr會有所幫助)。

您可以通過聚合從連接中獲取所有ids,並在沒有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。

+0

這不會解決這個問題。您的查詢將給我所有具有Type-1但沒有Type-2的文檔(相當於給出Type-1的所有文檔)。如果在兩種類型中都找到相同的_id,則不應將其作爲響應的一部分返回(但會根據您的查詢) –

+0

好吧,您是對的:一個文檔不能有兩種類型。所以我會改變我的答案。 –