2014-06-15 101 views
1

我有一本關於書籍的數據集,每個書籍都可以使用一種或多種語言。每個用戶都註冊爲擁有一種或多種語言。Elasticsearch子集篩選器

當用戶搜索書籍時,我只想返回那些他們瞭解其所有語言的書籍。

例如,下面的兩本書是系統:

Book A: English, French, German 
Book B: English, Greek 

如果約翰被註冊爲不懂英語,德語,法語和意大利語,那麼他的查詢結果中不應包括書B.

我的系統目前使用Apache Solr編寫,其中我最終編寫了一個插件來執行子集操作(如果記錄的語言是用戶語言的子集,其中用戶的語言被聲明爲查詢)。

但是,我想轉換到Elasticsearch後端。然而,這種特定的子集行爲似乎並不是核心過濾器包的一部分。我錯過了什麼,或者我應該看看寫一個類似的插件/自定義過濾器?

+1

您是否發現ElasticSearch(或任何其他數據庫/搜索系統)覆蓋此方法? – Tor

+0

不 - 我最終得到了一個替代實現,在這裏我查詢(elasticsearch)書籍,然後在它們上面快速查找一下java,以確定用戶是否可以理解所有語言。如果某些語言不被理解,結果集將被標記,並將其傳遞給用戶。不過,我很樂意聽到有一種實現原始設計的方法! –

+1

以下是我自己的筆記:https://docs.google.com/document/d/1ngZU89rWc3fQMU8CSSW_yFCyeWEmJzJRngmEl88IrvE。如果你或其他人發現了一個現成的解決方案(這可能可以處理大集),那麼讓我知道。如果我找到一些東西,我一定會回到這裏來:) – Tor

回答

1

這可以使用腳本過濾器來完成,您可以將它作爲參數傳遞給以逗號分隔的字符串列表,並使用for循環來確保每個組件都包含在內,即使一個不使用break並返回false。如果所有當前循環退出並返回true。

我不確定這是多高效,但理論上這可以在elasticsearch上完成。理想情況下,應用優化的過濾器來縮小書籍的範圍,然後在這些子集上查看https://www.elastic.co/blog/all-about-elasticsearch-filter-bitsets以及post_filters上的文檔,效率應該在一系列查詢中進行理想測試,因爲一旦結果開始爲緩存

0

另一個可能的答案是將其顛倒過來。這些數據具有一定的特徵。假設足夠的規模和現實世界的實用性,其基本思想是對於書籍,用戶和作者而言,語言領域的基數是極低的(你可以通過使用語言根作爲一個領域來進一步改進,例如拉丁語 - 英語,意大利語和原語言http://en.wikipedia.org/wiki/List_of_proto-languages)索引時間)用戶通常傾向於從同一個家庭中瞭解語言,這樣您就可以利用這一事實來獲益。

然後,用戶查詢將基本上是所有存在的集合和他知道的集合的差異。這些可以很容易地建模爲一堆使用執行的過濾器:bool標誌(內部非常優化的位集)來緩存和合並它們。確保你明智的執行過濾順序看看https://www.elastic.co/blog/all-about-elasticsearch-filter-bitsets