lucene 如何在Solr 4.8.1中获得“以...结尾”搜索?

jjjwad0x  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(270)

我有一个文档,索引在Solr上,其中包含以下字段:

{
    "manufacturerSkuEndsWith": [
        "DU351118DR0"
    ]
}

我的目标是在manufacturerSkuEndsWith字段上进行“ends with”搜索。例如,以下查询应该与上面的值匹配:DR08DR018DR0118DR0 ...但这些查询不应匹配:一米五纳一,一米六纳一,一米七纳一......
我的问题是查询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>

但此配置不执行“结束于”搜索:

我如何才能获得这种类型的搜索?

fkaflof6

fkaflof61#

您使用的是NGramTokenizer而不是EdgeNGramFilter,如示例所示。NgramTokenizer也会从字符串内部生成令牌,而不仅仅是从边缘生成。
要获得您所寻找的行为,您必须有一个KeywordTokenizer(它将把输入保留为单个标记),然后使用ReverseStringFilter将其反转--在使用EdgeNGramFilter从现在反转的字符串的开头生成字符串之前:

foo -> oof -> o, oo, oof

然后,您可以通过反向字符串过滤器再次运行这些版本,以获得“正确”的索引版本:

-> o, oo, foo

..或者,您也可以像在您的字段中所做的那样,反转输入字符串:

foo -> oof -> matches the oof token

相关问题