Solr WordDelimiterFilter在查询中生成单词部分和catenate

时间:2013-10-31 14:32:20

标签: solr

我想查询 wi-fi 以匹配索引中 wifi 的文档。所以,我正在使用 solr.WordDelimiterFilterFactory 来查询查询中的单词:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1" splitOnNumerics="1" stemEnglishPossessive="0" preserveOriginal="0"/>
        <filter class="solr.ICUFoldingFilterFactory"/>
    </analyzer>
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1" splitOnNumerics="1" stemEnglishPossessive="0" preserveOriginal="0"/>
        <filter class="solr.ICUFoldingFilterFactory"/>
    </analyzer>
</fieldType>

但是使用此配置查询 LGA1155 LGA 1155 不匹配,因为查询标题:LGA1155 被解析为:(标题:标题:1155标题:lga1155)~3

如果我不查询查询中的单词, LGA1155 匹配 LGA 1155 ,因为查询被解析为:(标题:标题:1155)〜 2 。但是 wi-fi wifi 不匹配。

我正在使用 edismax 查询解析器, q.op AND 。 Solr版本:4.5。

那么,如何使 wi-fi 匹配 wifi LGA1155 匹配 LGA 1155 (和其他类似的查询)?

1 个答案:

答案 0 :(得分:8)

正如你所描述的那样,你想要连接单词部分,但是你想要分成数字。

你所拥有的catenateAll="1"并不好,因为它会撤消你想要实现的数字( LGA115 成为 LGA 1155 )的分裂。

使用分析仪中WhitespaceTokenizerFactory的这些设置进行尝试。

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.WordDelimiterFilterFactory"
            generateWordParts="0" catenateWords="1"
            generateNumberParts="1" catenateNumbers="0" splitOnNumerics="1"
            catenateAll="0" splitOnCaseChange="0"
            stemEnglishPossessive="0" preserveOriginal="0" />
        <filter class="solr.ICUFoldingFilterFactory" />
    </analyzer>
</fieldType>

这将生成以下令牌

  • wi-fi - &gt; wifi
  • Wi-Fi - &gt; wifi
  • WiFi - &gt; wifi
  • LGA1155 - &gt; lga 1155
  • LGA 1155 - &gt; lga 1155
  • LGA-1155 - &gt; lga 1155

正如你所看到的,wifi变成了一个单词而LGA1155被分开了。


另一件事是,正如您在我的示例中所看到的,如果查询器和索引时间上的分析器应该是相同的,那么您可以省略type中的analyzer属性} element并完全删除这两个元素中的一个。

所以而不是

<fieldType ... >
    <analyzer type="query">
       <!-- same stuff -->
    </analyzer>
    <analyzer type="index">
       <!-- same stuff -->
    </analyzer>
</fieldType>

只需

<fieldType ... >
    <analyzer>
       <!-- will be taken to index and query time -->
    </analyzer>
</fieldType>