4

我希望查询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不匹配,因为查询title:LGA1155被解析为:(title:lga title:1155 title:lga1155)~3

如果我不在查询中连接单词,则LGA1155匹配LGA 1155,因为查询被解析为:(title:lga title:1155)~2。但随后wi-fi与wifi不匹配。

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

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

4

1 回答 1

10

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

你在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>

这将产生以下标记

  • 无线网络->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>

只是

<fieldType ... >
    <analyzer>
       <!-- will be taken to index and query time -->
    </analyzer>
</fieldType>
于 2013-10-31T22:28:07.007 回答