我想查询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)
但使用此配置查询LGA1155与LGA 1155不匹配,因为查询标题:LGA1155被解析为:(标题:lga标题:1155标题:lga1155)~3
如果我没有在查询中输入单词,LGA1155会匹配LGA 1155,因为查询被解析为:( 标题:标题:1155)~2.但是那时wi-fi与wifi不匹配.
我正在使用edismax查询解析器,q.op是AND.Solr版本:4.5.
那么,如何使wi-fi匹配wifi和LGA1155匹配LGA 1155(和其他类似的查询)?
正如你所描述的那样,你想要连接单词部分,但是你想要分割数字.
在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)
这将产生以下令牌
wifi
wifi
wifi
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)