簡體   English   中英

如何在 Solr 4.8.1 中進行“以”搜索?

[英]How to get an “ends with” search in Solr 4.8.1?

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

{
    "manufacturerSkuEndsWith": [
        "DU351118DR0"
    ]
}

我的目標是在manufacturerSkuEndsWith字段上進行“結尾”搜索。 例如,以下查詢應匹配上述值: DR08DR018DR0118DR0 ...但這些查詢不應匹配: DU35118DR118 ...

我的問題是查詢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>

但此配置不執行“結尾”搜索:

Solr 分析工具的屏幕截圖

我怎樣才能獲得這種類型的搜索呢?

如示例中所示,您使用的是 NGramTokenizer 而不是 EdgeNGramFilter。 NgramTokenizer 也會從字符串內部生成標記,而不僅僅是從邊緣生成。

要獲得您正在尋找的行為,您必須有一個 KeywordTokenizer (它將輸入保持為單個標記),然后使用 ReverseStringFilter 來反轉它 - 在使用 EdgeNGramFilter 從現在反轉的開頭生成字符串之前細繩:

foo -> oof -> o, oo, oof

然后,您可以再次通過反向字符串過濾器運行這些以獲取“正確”版本的索引:

-> o, oo, foo

..或者您可以像在您的字段中所做的那樣做,並反轉輸入字符串:

foo -> oof -> matches the oof token

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM