[英]How to get an “ends with” search in Solr 4.8.1?
我有一個文檔,索引在 Solr 上,其中包含以下字段:
{
"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 的行為,所以這就是我在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>
但此配置不執行“結尾”搜索:
我怎樣才能獲得這種類型的搜索呢?
如示例中所示,您使用的是 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.