每個Lucene doc都是一個配方,每個配方都有配料。具有多個相同屬性字段的Lucene索引
我的工作方向是能夠搜索配料,並給出結果,說兩種配料滿足四種配比。 (例如)
那麼如何將配料添加到文檔?在solr中,我可以創建多個字段並將它們全部保存起來,我可能會因爲只保存一種成分而做錯了。
這也適用於像'標籤'這樣的字段。
p.sim使用Zend框架,如果它很重要。
每個Lucene doc都是一個配方,每個配方都有配料。具有多個相同屬性字段的Lucene索引
我的工作方向是能夠搜索配料,並給出結果,說兩種配料滿足四種配比。 (例如)
那麼如何將配料添加到文檔?在solr中,我可以創建多個字段並將它們全部保存起來,我可能會因爲只保存一種成分而做錯了。
這也適用於像'標籤'這樣的字段。
p.sim使用Zend框架,如果它很重要。
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")
我在這裏看到的兩種可能的方法:
我建議你嘗試第二種方法,看看它是否有幫助。