0

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

{
    "manufacturerSkuEndsWith": [
        "DU351118DR0"
    ]
}

我的目标是在该领域进行“以”结尾的搜索manufacturerSkuEndsWith。例如,以下查询应与上述值匹配:DR0, 8DR0, 18DR0, 118DR0... 但这些查询不应匹配:DU35, 118DR, 118...

我的问题是查询118与该文档匹配,即使DU351118DR0不以118.

我的 Solr & Lucene 版本是 4.8.1。我发现在这个版本中side="back"不再支持 EdgeNGramTokenizer :LUCENE-3907。在这个线程中,他们建议使用 aReverseStringFilter来获得类似于 EdgeNGramTokenizer 的行为side="back",所以这就是我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>

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

Solr 分析工具的屏幕截图

我怎样才能获得这种类型的搜索呢?

4

1 回答 1

1

如示例中所示,您使用的是 NGramTokenizer 而不是 EdgeNGramFilter。NgramTokenizer 也会从字符串内部生成标记,而不仅仅是从边缘生成。

要获得您正在寻找的行为,您必须有一个 KeywordTokenizer (它将输入保持为单个标记),然后使用 ReverseStringFilter 来反转它 - 在使用 EdgeNGramFilter 从现在反转的开头生成字符串之前细绳:

foo -> oof -> o, oo, oof

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

-> o, oo, foo

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

foo -> oof -> matches the oof token
于 2021-02-25T11:35:05.827 回答