2015-10-07 69 views
8

我正在開發類似於Tinder的應用程序。在ElasticSearch中,我收集了大約50萬用戶及其位置)。每當用戶打開應用程序搜索附近的用戶時,我都會在該集合上運行彈性搜索查詢。查詢相當複雜,它不僅考慮位置,還考慮了用戶的活躍程度或他擁有多少照片。如何從彈性搜索查詢中排除大量ID

我所苦惱的是如何排除當前用戶已經從查詢中滑過的用戶。實現這一點的一種天真的方式可能是維護嵌套的用戶ID數組作爲索引中的每個用戶文檔的一部分,並基於此排除。但是,由於每個用戶都會花費數十萬次,因此這個陣列可能會超級大,所以它不是一個可擴展的解決方案。

有沒有一種方法可以根據彈性搜索查詢中的大量實體排除不會影響性能的ID?

回答

9

使用條款查詢的查找功能:Terms lookup mechanism

當指定了很多方面的條件過濾器可以是有益的,在從文檔獲取那些長期價值真實需要指數。一個具體的例子就是過濾你的關注者推文推文。術語過濾器中指定的用戶標識可能會很多。在這種情況下,使用術語過濾器的術語查找機制是有意義的。

+0

哇,這看起來不錯,謝謝! –

+0

工程就像一個魅力!所以這兩個答案都能夠充分解決我的問題,但我選擇這個答案作爲正確的答案,因爲它是一個更優雅的解決方案。非常感謝 –

+1

爲了未來人們的利益,很高興看到解決方案在工作,它實現了術語查找機制。 – Val

9

您可以嘗試將ids filter添加到複雜查詢的bool/must_not子句中,並查看其行爲。

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
       ...    <--- your other "must" constraints 
      ], 
      "must_not": [ 
      { 
       "ids": { 
       "values": [ "id1", "id2", "id3" ] <--- your list of ids to exclude 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
}