2010-03-09 169 views
6

每個Lucene doc都是一個配方,每個配方都有配料。具有多個相同屬性字段的Lucene索引

我的工作方向是能夠搜索配料,並給出結果,說兩種配料滿足四種配比。 (例如)

那麼如何將配料添加到文檔?在solr中,我可以創建多個字段並將它們全部保存起來,我可能會因爲只保存一種成分而做錯了。

這也適用於像'標籤'這樣的字段。

p.sim使用Zend框架,如果它很重要。

回答

12

Lucene文檔支持添加多個相同名稱的字段。即可以反覆調用:

document.add(new Field("name"), value) 

所以是你做的事:

# (pseudo-code) 
document1.add(new Field("ingredient"), "vanilla") 
document1.add(new Field("ingredient"), "strawberry") 
index.add(document) 

# And then search for 
index.search("ingredient", "vanilla" && "strawberry") 

你會得到文檔1。但是,如果你搜索:

index.search("ingredient", "vanilla" && "apple") 

您將無法取回文檔1

如果您搜尋:

index.search("ingredient", "vanilla" || "apple") 

你也還是會回到文檔1

如果你想看到哪些成分相匹配,你可以簡單地將文檔保存的領域存儲字段,然後對每個匹配文檔檢索的字段列表,並將它們與用戶查詢。

另請注意,默認情況下,PositionIncrementGap用於添加到文檔中的名稱相同的字段爲0。

這意味着,如果你說:

index.search("ingredient", "chocolate orange") 

你能避免:

document1.add(new Field("ingredient"), "chocolate") 
    document1.add(new Field("ingredient"), "orange") 

那麼這將是,如果它被稱爲「巧克力橙」,這可能匹配在一個單一成分處理這爲PositionIncrementGap> 1設置了一個值,這將產生:

0匹配爲:

index.search("ingredient", "chocolate orange") 

和1匹配:

index.search("ingredient", "chocolate" && "orange") 
0

我在這裏看到的兩種可能的方法:

  1. 進行非標準化數據 - 創建一個單獨的文檔,以配方各成分,讓所有的文件爲配方共同的配方ID。然後,在搜索過程中,聚合配方ID的所有匹配項。有點醜陋。
  2. 將所有成分連接成一個共同的字段,並將其作爲「文本」進行索引。然後使用帶有'OR'的布爾查詢搜索配料(這在Java Lucene術語中稱爲'Should',我不知道PHP的等價物)。

我建議你嘗試第二種方法,看看它是否有幫助。

相關問題