Solr复合词标记器 - 结果视为OR语句

时间:2012-06-18 09:40:32

标签: solr filter

荷兰语和德语的确有单词可以组合成 new 单词;复合词。

例如" accountmanager"被认为是一个单词,加上单词" account"和"经理"。我们的用户将使用" accountmanager"和"客户经理"在文档和查询中,并期望两个查询都有相同的结果。

为了能够解压缩(拆分)单词,solr有一个我在模式中配置的字典过滤器:

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

compound-word-dictionary.txt文件包含用于分解复合词的单词列表。在此列表中,您将找到例如单词&#34; account&#34;和&#34;经理&#34;。

在使用查询&#34; accountmanager&#34;进行搜索时,在Solr调试器中进行分析时,解压缩结果是正常的: (术语):

  • 的AccountManager
  • 帐户
  • 管理器

然而,此结果被视为OR语句,并查找至少包含其中一个术语的所有文档。我希望它表现得像一个AND语句(所以我只希望结果同时包含术语&#34;帐号&#34;以及&#34;经理&#34;在文档中)。

我已尝试将架构中的defaultOperator设置为&#34; AND&#34;,但在使用 edismax 时会忽略此项。所以我已经将建议的 Min-should-Match 设置为100%(mm = 100%),同样没有任何期望的结果。调整模式中字典过滤器的属性不会将行为更改为&#34; AND&#34;。

在使用字典复合词令牌工厂时是否有人遇到过这种行为,并且知道一种解决方案让它的行为类似于AND语句?

2 个答案:

答案 0 :(得分:3)

它按预期工作,DictionaryCompoundWordTokenFilterFactory只是添加它找到的'内部词',在这种情况下,'account'和'manager'但可能只是一个,如果例如单词是'accountbanana'并且'banana'不在字典中,只会添加'account'。

这有助于某人寻找“经理”并找到具有“帐户管理员”的文档。

为了获得您想要的行为(我知道您在查询方面应用此行为),您可以使用一个字典使accountmanager =“客户经理”

答案 1 :(得分:2)

当我正在研究这个问题时,只是抬起头来,这样做会产生很多额外的噪音。由于SOLR 3.6在CompoundWordTokenFilterBase中将每个损坏的标记的位置增量设置为0,因此您将获得正确索引的查询(排序)。然而,在查询时,您将获得复合词的巨大OR查询,因为AnalyzerQueryNodeProcessor仅检查positionCount == 1。

例如,搜索Castaway将查询(抛弃或抛弃或离开)。这会增加很多噪音,电影Castaway(真的是Cast Away)会起作用,但你也会得到所有只有“离开”或只是“演员”的东西。

我们实际上已经修补Lucene来setPositionIncrement为1,加入AnalyzerQueryNodeProcessor一些额外的代码,以便有逻辑或运算PhraseQueryNodes在那里你会得到(“弃儿”或“抛弃”)。这也是不正确的,但降低了噪音。如果将position始终设置为1,则短语查询可以返回奇怪的结果,因为(castaway0,cast1,away2)可以返回“castaway away”的结果。此外,后期条款的位置现已关闭。有关更好的说明,请参阅:http://blog.mikemccandless.com/2012/04/lucenes-tokenstreams-are-actually.html