2011-05-15 19 views
2

我正在使用關係數據庫作爲項目,並使用Solr對它們進行索引以獲得Solr提供的快速全文搜索。但在同一時間,我需要用戶能夠按項目狀態過濾,這當然是該用戶特有的值。按用戶特定的數據進行過濾,但也使用搜索引擎,如Solr

ItemUserStatus值是項目,用戶和狀態之間的關聯,所以它是不同的表格。 所以我需要使用Solr的搜索功能,但需要在同一個查詢中按照用戶特定的信息進行過濾,這些信息似乎並不適合我。

一個示例查詢會聽起來像:給我帶有標題「標題」的項目,您已在「待定」狀態中設置。 我不知道什麼是最好的方式來做到這一點,或者如果我使用正確的工具。

感謝, 斯特凡

回答

0

當設計你的Solr模式,你需要denormalize/flatten your data。在這種情況下,您似乎在搜索「項目」,因此模式將圍繞項目進行。填充Solr索引時,您需要一個字段「標題」和另一個動態字段「狀態」,因此您的查詢將如Title:something State_123:Pending那樣簡單,其中123是用戶標識。

+0

嗨,狀態值是特定於用戶和項目。所以它是一個列中的值:id,user_id,item_id,state_id。所以它對於一個用戶而言是等待的,但對另一個用戶可能是封閉的。謝謝! – StefanH 2011-05-15 21:47:06

+0

@StefanH:編輯答案 – 2011-05-15 22:04:20

+0

嗨Mauricio。所以這意味着對於每個項目我都會索引用戶爲該項目保存的所有狀態。因此,例如,如果10,000個用戶的某個項目處於待處理狀態,我將擁有10,000個不同的State_xxxx:待處理項目的待處理索引。每個項目都有類似的情況。這是否有效? – StefanH 2011-05-16 07:52:27

0

看看RavenDB。它是一個建立在Lucene之上的面向文檔的數據庫,因此您可以得到一個Solr和一個數據庫的混合體,除了它不是一個搜索引擎,而是一個具有全文搜索功能的全功能文檔數據庫支持文本字段。然後

LINQ表達式查詢RavenDB您的例子是:

from doc in docs 
where doc.Title == "Title" && doc.State == DocState.Pending 
select doc 
+0

我使用Linux,我看到RavenDB是Windows的東西 – StefanH 2011-05-16 13:10:07

+0

它也運行在Mono上 – synhershko 2011-05-16 13:19:22