我想查询 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.op 是 AND。 Solr 版本:4.5。
那么,如何让 wi-fi 匹配 wifi 和 LGA1155 匹配 LGA 1155(和其他类似的查询)?
最佳答案
正如您所描述的,您想将单词部分连接起来,但又想在数字上进行拆分。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>
这将产生以下 token
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>
只是
<fieldType ... >
<analyzer>
<!-- will be taken to index and query time -->
</analyzer>
</fieldType>
关于Solr WordDelimiterFilter 生成单词部分并在查询中连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19709304/