2017-09-29 74 views
0

我有一個索引產品是Solr。我需要爲每個客戶提供定製的產品清單,這樣我必須爲每個客戶排除一些特定的產品。 目前,我將這種排除產品的客戶關係存儲在SQL數據庫中,然後使用術語查詢在Solr中對其進行篩選。有沒有一種方法可以將這種關係存儲在Solr中,這樣我就不必每次都從SQL計算排除列表。如何在運行時從Solr過濾大量IDS

的東西非常相似,我們可以在elasticsearch使用https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html

可能的方式做,我能想到Solr中做的:

  1. 保持在產品指數本身,和過濾的客戶名單在那。但是如果我必須重新索引所有文檔,這將會非常痛苦。這個列表也可能很大。

  2. 我能想到的另一種方式是維護一個獨立的核心,用於保存每個客戶的文檔並排除product_id,並使用{!join}執行加入以過濾掉客戶的產品。這是一個可擴展的解決方案嗎?

應該是什麼Solr中存儲這類數據的理想方法。

回答

1

SQL DB是否存在任何性能問題?查詢數據庫並獲取ID並將它們發送到Solr是完全正確的。您將避免複雜性和數據重複。無論如何你必須做一些計算來將這些ID發送到Solr。

但是要回答您的問題,是的,您可以將每個客戶排除的產品ID確實存儲在單獨的索引中。您將使用多值字段並update using atomic updates。如果這樣做,請確保簡化索引模式,不要使用用於ID的分析器(僅使用string類型,而不使用任何標記器或過濾器)。

您不需要執行Solr連接查詢。您只需查找每個客戶的產品ID(第一個查詢)並將其作爲CSV處理,然後使用從索引(第二個查詢)檢索到的產品ID執行terms query

+0

感謝這裏的響應。我想我只會繼續使用SQL方法。將過濾使用術語查詢的ID。 –

1

你需要找到最好的折衷辦法爲你

最佳查詢時間性能 您現場(多值的)添加到產品指標:因基數allowed_users(或forbidden_​​users)(您想最小化)。 這將需要首次重新建立索引,併爲每個用戶權限更改索引更新。 爲了減少網絡流量和優化更新,您可以看看原子更新[1]。

最好的指數時間表演 如果前面的方法是不是在你的情況下是可行的或者不能滿足你,你可以嘗試優化索引側。 你可以索引文檔中的一個單獨的集合:

<Id> 
<product_id> 
<user_id> 

您可以使用查詢時間加入到過濾收集當前用戶,然後回來的產品來過濾他們在您的查詢。

因此,基本上,你已經想到了這兩個想法:)

[1] https://lucene.apache.org/solr/guide/6_6/updating-parts-of-documents.html