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

Rin*_*nas 4 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>
Run Code Online (Sandbox Code Playgroud)

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

如果我没有在查询中输入单词,LGA1155会匹配LGA 1155,因为查询被解析为:( 标题:标题:1155)~2.但是那时wi-fiwifi不匹配.

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

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

che*_*ffe 8

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

catenateAll="1"你有没有好,因为这将撤消NUMERICS的分裂(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>
Run Code Online (Sandbox Code Playgroud)

这将产生以下令牌

  • wi-fi - > wifi
  • Wi-Fi - > wifi
  • WiFi - > wifi
  • LGA1155 - > lga 1155
  • LGA 1155 - > lga 1155
  • LGA-1155 - > lga 1155

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


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

而不是

<fieldType ... >
    <analyzer type="query">
       <!-- same stuff -->
    </analyzer>
    <analyzer type="index">
       <!-- same stuff -->
    </analyzer>
</fieldType>
Run Code Online (Sandbox Code Playgroud)

只是

<fieldType ... >
    <analyzer>
       <!-- will be taken to index and query time -->
    </analyzer>
</fieldType>
Run Code Online (Sandbox Code Playgroud)