【问题标题】:Solr compound word tokenizer - results treated as OR statementSolr 复合词标记器 - 结果被视为 OR 语句
【发布时间】:2012-12-07 01:48:01
【问题描述】:

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

例如,“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 语句?

【问题讨论】:

    标签: solr filter


    【解决方案1】:

    它按预期工作,DictionaryCompoundWordTokenFilterFactory 只是添加它找到的“内部单词”,在本例中为“帐户”和“经理”,但可能只是一个,例如单词是“帐户香蕉”和'banana' 不在字典中,只有 'account' 会被添加。

    这用于查找“经理”并查找具有“帐户经理”的文档的目的。

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

    【讨论】:

    • 感谢您的解释。 DictionaryCompoundWordTokenFilterFactory 行为的明确答案。我误解了它的使用,现在发现在这种情况下它不能满足我的需求。您建议的提示实际上是我的下一步(使用 solr.SynonymFilterFactory)。我希望结合复合词过滤器工厂来简化同义词过滤器。
    【解决方案2】:

    当我正在研究这个时,请注意,这样做时会增加很多噪音。由于 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

    【讨论】:

    • 很抱歉恢复了一个非常古老的话题,但它在 2020 年仍然运作良好......我想,在查询时应用 Dictionary Decompounder 时,正确的行为应该是:(CompoundTerm1Term2 OR (复合 AND Term1 AND Term2)) 有意义吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2016-10-02
    • 1970-01-01
    • 2017-12-15
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多