2016-08-11 28 views
0

我試圖理解提升,如果提高是我的問題的答案。 我有一個索引,並有不同類型的數據。 EG:索引動物。其中一個領域是動物類型。這個值可以是肉食性的,草食性的等等。 現在當我們在搜索中查詢時,我想要顯示類型肉食性的結果在頂部,然後是草食性類型。 也有可能只顯示從一個類型說,然後從其他類型的前3個結果?Solr Boosting Logic Concepts

假設一個草食性類型,我們有一個名爲蔬菜的領域。這隻會對一種草食動物類型有價值。現在 ,也可以是可能有助推規定如下規則: 增壓水平: animaltype:肉食 然後animaltype:草食性和vegatablesfield:菠菜 然後animaltype:herbivoruous和vegetablesfield:胡​​蘿蔔

等基本上升壓用各個層面的各個領域。我剛接觸這個概念。獲得一些輸入/指導將非常有幫助。

感謝, Kasturi恰範

回答

1

你舉的例子更接近比提高排序,因爲你有多麼重要的每個文檔的優先級列表 - 同時提高(Solr中)通常適用有點更流暢,意義行之間X型和Y型的文件。

然而 - 提高適當的大值將實際上給你相同的結果,將文件放到不同的得分「區域」,然後將給予你正在尋找的排序順序。您可以通過在查詢中附加debugQuery=true來查看每個術語貢獻的分數。 Boosting說'具有這個值的文檔比具有不同值的文檔重要z倍「,但是如果文檔只包含來自搜索的低分值標記(通常是非常常見的詞),而其他文檔包含高分值標記(很少有文字),後者的文件可能仍然被認爲更重要。

示例:搜索「城市巴黎」,其中大多數文檔包含單詞「城市」,但只有少數包含單詞「巴黎」(但不包含城市)。即使你增加了分配給德國國家的所有文件,city的分數可能仍然較低 - 即使增加因素比「巴黎」單獨貢獻的分數。這可能不會發生在現實生活中,但是您應該知道提升實際發生了什麼變化。

使用edismax處理程序,您可以應用升壓兩種不同的方式 - 一種是使用boost=,這是乘法,或者爲使用bq=bf=,這是附加的。不同之處在於助推器如何影響最終分數。

對於你的榜樣,得到類似的東西,你要問什麼最簡單的方法,就是用bq(升壓查詢):

bq=animaltype:Carnivorous^1000& 
bq=animaltype:Herbivorous^10 

這些提升將可能大到足以將所有將這些查詢匹配到他們自己的桶中的文檔,而不會在組之間移動。要按照您的示例創建「不同級別」,您需要調整這些值(並記住,如果草食和吃菠菜都可以對同一文檔應用多個提升)。

另一種方法是使用queryif和類似函數創建函數查詢,以生成可用作排序值的單個整數值。如果索引文檔是靜態的(如您的示例所示),則還可以計算此值,然後按該字段進行排序。如果排序值發生變化,它將要求您對文檔進行重新索引,但這可能是一個簡單而有效的解決方案。

要實現「前三種類型的結果」,您可能需要查看Result grouping support - 這可以在單個字段中爲每個值獲取「x文檔」。據我所知,沒有辦法說「我希望其中的三個在頂部,其餘的是其他值」,除了做多個查詢(並且不包括已經從第二個查詢中檢索到的三個) )。通常,發出多個查詢的效果同樣好(或更好)。

+0

嗨MatsLindh。非常感謝您的解釋。我正在閱讀solr的東西,以便更好地理解。排序也可能不是我們的答案。但Boosting和Result組合似乎很有前途。基本上,我想我會提高文件的質量,並給予某些類型的文件更高的分數。然後,在分組時,我會按類型對它們進行分組。並將每個組中的限制設置爲3 ..同樣在組中,默認情況下他們將按照分數排序。 –