7

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

例如,“accountmanager”被认为是一个词,由“account”和“manager”这两个词复合而成。我们的用户将在文档和查询中使用“accountmanager”和“account manager”,并期望这两个查询的结果相同。

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

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

Compound-word-dictionary.txt 文件包含用于分解复合词的单词列表。在此列表中,您会找到例如“帐户”和“经理”这两个词。

当在 Solr 调试器中使用查询“accountmanager”搜索时分析时,分解结果是好的:(术语文本):

  • 客户经理
  • 帐户
  • 经理

但是,此结果被视为 OR 语句,并查找其中至少包含一个术语的所有文档。我希望它表现得像一个 AND 语句(所以我只想要文档中同时包含术语“帐户”和“经理”的结果)。

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

有没有人在使用字典复合词标记工厂时遇到过这种行为并且知道一个解决方案让它表现得像 AND 语句?

4

2 回答 2

4

它按预期工作,DictionaryCompoundWordTokenFilterFactory 只是添加它找到的“内部单词”,在这种情况下,“帐户”和“经理”都可能只是一个,例如,如果单词是“帐户香蕉”和“香蕉”不在字典中,只会添加“帐户”。

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

为了得到你想要的行为(我知道你在查询端应用这个)你可以使用一个字典,使 accountmanager="account manager"

于 2012-06-18T12:18:07.797 回答
4

当我正在研究这个时,请注意,这样做时会有很多额外的噪音。由于 SOLR 3.6 将 CompoundWordTokenFilterBase 中每个损坏标记的位置增量设置为 0,因此您将获得正确索引的查询(有点)。然而,在查询时,您将获得复合词的巨大 OR 查询,因为 AnalyzerQueryNodeProcessor 仅检查 positionCount==1。

例如,搜索 Castaway 将查询 (castaway or cast or away)。这会增加很多噪音,电影 Castaway(实际上是 Cast Away)会起作用,但你也会得到只有“Away”或“Cast”的所有内容。

我们实际上已将 Lucene 修补为 setPositionIncrement 为 1,并在 AnalyzerQueryNodeProcessor 中添加了一些额外的代码,以便您将获得 OR'd PhraseQueryNodes(“castaway”或“cast away”)。这也是不正确的,但会降低噪音。如果将位置始终设置为 1,则短语查询可能会返回奇怪的结果,因为 (castaway0, cast1, away2) 可以返回“castaway away”的结果。此外,后来的职位现在也关闭了。如需更好的描述,请参阅:http ://blog.mikemccandless.com/2012/04/lucenes-tokenstreams-are-actually.html

于 2012-12-06T17:48:01.680 回答