如何解决如何在 Solr 4.8.1 中获得“以”结尾的搜索?
{
"manufacturerSkuEndsWith": [
"DU351118DR0"
]
}
我的目标是在 manufacturerSkuEndsWith
字段上进行“以”结尾的搜索。例如,以下查询应与上述值匹配:DR0
、8DR0
、18DR0
、118DR0
...但这些查询不应匹配:DU35
,118DR
,118
...
我的问题是查询 118
匹配该文档,即使 DU351118DR0
不以 118
结尾。
我的 Solr & Lucene 版本是 4.8.1。我发现在此版本中不再支持 EdgeNGramTokenizer 的 side="back"
:LUCENE-3907。在此线程中,他们建议使用 ReverseStringFilter
来获得类似于带有 side="back"
的 EdgeNGramTokenizer 的行为,因此这就是我在 manufacturerSkuEndsWith
中配置 schema.xml
字段的方式:
<field indexed="true" multiValued="true" name="manufacturerSkuEndsWith" stored="true" type="smccTextReversednGram"/>
<copyField dest="manufacturerSkuEndsWith" source="ManufacturerSku"/>
<fieldType class="solr.TextField" name="smccTextReversednGram" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.NGramTokenizerFactory" maxGramSize="10" minGramSize="3"/>
<filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ReverseStringFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ReverseStringFilterFactory"/>
</analyzer>
</fieldType>
但此配置不执行“以”结尾的搜索:
我怎样才能获得这种类型的搜索?
解决方法
您使用的是 NGramTokenizer 而不是 EdgeNGramFilter,如示例中所示。 NgramTokenizer 也会从字符串内部生成标记,而不仅仅是从边缘生成标记。
要获得您正在寻找的行为,您必须有一个 KeywordTokenizer(它将输入作为单个标记保留),然后使用 ReverseStringFilter 将其反转 - 在使用 EdgeNGramFilter 从开头生成字符串之前现在反转的字符串:
foo -> oof -> o,oo,oof
然后您可以再次通过反向字符串过滤器运行它们以获得索引的“正确”版本:
-> o,foo
.. 或者你可以像你在你的领域所做的那样,并反转输入字符串:
foo -> oof -> matches the oof token
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。