我有一个文档,索引在Solr上,其中包含以下字段:
{
"manufacturerSkuEndsWith": [
"DU351118DR0"
]
}
我的目标是在manufacturerSkuEndsWith
字段上进行“ends with”搜索。例如,以下查询应该与上面的值匹配:DR0
、8DR0
、18DR0
、118DR0
...但这些查询不应匹配:一米五纳一,一米六纳一,一米七纳一......
我的问题是查询118
与该文档匹配,即使DU351118DR0
不是以118
结尾。
我的Solr & Lucene版本是4.8.1。我发现在这个版本中不再支持EdgeNGramTokenizer的side="back"
:LUCENE-3907。在这个线程中,他们建议使用ReverseStringFilter
来获得类似于使用side="back"
的EdgeNGramTokenizer的行为,因此这是我在schema.xml
中配置manufacturerSkuEndsWith
字段的方式:
<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>
但此配置不执行“结束于”搜索:
我如何才能获得这种类型的搜索?
1条答案
按热度按时间fkaflof61#
您使用的是NGramTokenizer而不是EdgeNGramFilter,如示例所示。NgramTokenizer也会从字符串内部生成令牌,而不仅仅是从边缘生成。
要获得您所寻找的行为,您必须有一个KeywordTokenizer(它将把输入保留为单个标记),然后使用ReverseStringFilter将其反转--在使用EdgeNGramFilter从现在反转的字符串的开头生成字符串之前:
然后,您可以通过反向字符串过滤器再次运行这些版本,以获得“正确”的索引版本:
..或者,您也可以像在您的字段中所做的那样,反转输入字符串: