荷兰语和德语的确有单词可以组合成 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调试器中进行分析时,解压缩结果是正常的: (术语):
然而,此结果被视为OR语句,并查找至少包含其中一个术语的所有文档。我希望它表现得像一个AND语句(所以我只希望结果同时包含术语&#34;帐号&#34;以及&#34;经理&#34;在文档中)。
我已尝试将架构中的defaultOperator设置为&#34; AND&#34;,但在使用 edismax 时会忽略此项。所以我已经将建议的 Min-should-Match 设置为100%(mm = 100%),同样没有任何期望的结果。调整模式中字典过滤器的属性不会将行为更改为&#34; AND&#34;。
在使用字典复合词令牌工厂时是否有人遇到过这种行为,并且知道一种解决方案让它的行为类似于AND语句?
答案 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