2012-06-18 41 views
6

荷蘭語和德語語言確實有可以合併爲新詞單詞的詞;複合詞。Solr複合詞詞形標記器 - 結果視爲OR語句

例如,「accountmanager」被視爲一個單詞,由單詞「account」和「manager」組成。我們的用戶將在文檔和查詢中使用「accountmanager」和「account manager」,並期待兩個查詢的結果相同。

爲了能夠元分解(分割)的話,solr的具有我在架構中配置了一個字典濾波器:

<filter class="solr.DictionaryCompoundWordTokenFilterFactory" dictionary="../../compound-word-dictionary.txt" minWordSize="8" minSubwordSize="4" maxSubwordSize="15" onlyLongestMatch="true"/> 

的化合物字-dictionary.txt文件包含單詞列表用於分解複合詞。在這個列表中,您將找到例如「帳戶」和「經理」等字樣。

該邦元分解結果是正確的,當Solr的調試分析與查詢 「的AccountManager」 搜索時: (項文本):

  • 的AccountManager
  • 帳戶
  • 經理

但是,此結果被視爲OR語句,並查找至少包含其中一個條款的所有文檔。我希望它的行爲像一個AND語句(所以我只需要在文檔中同時包含術語「帳戶」和「經理」的結果)。

我已經嘗試將架構中的defaultOperator設置爲「AND」,但在使用edismax時忽略此操作。因此,我已將擬建的Min-should-Match設置爲100%(mm = 100%),同樣沒有任何所需的結果。調整架構中字典過濾器的屬性不會將行爲更改爲「AND」。

當使用字典複合詞標記工廠並知道解決方案讓它像AND語句一樣行事時,是否有人遇到過這種行爲?

回答

3

它正在按預期工作,DictionaryCompoundWordTokenFilterFactory只是添加了它找到的'內部詞語',在這種情況下,'account'和'manager'都可以,但只能是一個,例如單詞'accountbanana'和'香蕉'不在字典中,只有'賬戶'會被添加。

這有助於尋找「經理」的人以及查找具有「accountmanager」的文檔。

爲了得到你想要的行爲(我明白你是在查詢側應用此),你可以使用字典,使的AccountManager =「客戶經理」

+0

謝謝您的解釋。清楚地回答DictionaryCompoundWordTokenFilterFactory的行爲。我曲解了它的使用,並且現在看到它在這種情況下不會滿足我的需求。 你建議的提示實際上是我的下一步(使用solr.SynonymFilterFactory)。我希望能夠簡化與複合詞過濾器工廠結合使用的同義詞過濾器。 –

2

剛擡起頭,因爲我走看看這個,在做這件事時會有很多額外的噪音。由於SOLR 3.6將CompoundWordTokenFilterBase中每個已破壞的標記的位置增量設置爲0,因此您將得到正確(有點)索引的查詢。然而,當查詢時,你會得到一個巨大的OR查詢你的複合詞,因爲AnalyzerQueryNodeProcessor只檢查positionCount == 1。

例如,搜索Castaway將查詢(castaway或cast或away)。這增加了很多噪音,電影Castaway(這真的是Cast Away)可以工作,但你也可以得到一切只有「離開」或只是「演員」。

我們實際上已經將Lucene修補程序setPositionIncrement設置爲1,並在AnalyzerQueryNodeProcessor中添加了一些額外的代碼,以便您可以從OR'd PhraseQueryNodes中獲得(「castaway」或「cast away」)。這也是不正確的,但降低了噪音。由於(castaway0,cast1,away2),短語查詢可以返回奇怪的結果,因爲您可以將位置始終設置爲1,因爲它可以返回「逃避」的結果。此外,後期條款的立場現在關閉。有關更好的說明,請參閱:http://blog.mikemccandless.com/2012/04/lucenes-tokenstreams-are-actually.html