我想查询 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 (和其他类似的查询)?
答案 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>
这将生成以下令牌
wifi
wifi
wifi
lga
1155
lga
1155
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>