目前我们使用的是Django Haystack和Solr,但由于Cluster中的配置更简单,我们现在想将搜索后端切换到ElasticSearch。
在Solr上,我们的文本字段是nGram,它具有更模糊的搜索,而不是在单词上使用完全匹配。 它的配置如下:
<field name="text" type="ngram" indexed="true" stored="true" multiValued="false" />
<fieldType name="ngram" class="solr.TextField" >
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
现在我们尝试使用ElasticSearch并执行相同的操作,但我们Stuck因为我们无法像在Solr中那样配置Ngram字段。 所以它总是没有做出正确的匹配。
这意味着什么。 我们当前索引我们的模型ID,因为每个模型都以大于10000的ID开头,所以当我在搜索10001之前,我会得到ID为10001的模型(即使使用NGram) 在ElasticSearch上,我什么都没得到,它找不到任何东西。 我怎么能这样做。
答案 0 :(得分:2)
尝试这样的事情
映射:
"ngram":{
"type":"string",
"search_analyzer":"lowercase_analyzer",
"index_analyzer":"nGram_index_analyzer"
}
设置:
"analysis":{
"analyzer":{
"nGram_index_analyzer":{
"tokenizer":"keyword",
"filter":[
"lowercase",
"nGram_filter"
]
},
"lowercase_analyzer":{
"tokenizer":"keyword",
"filter":[
"lowercase"
]
}
},
"filter":{
"nGram_filter":{
"type":"nGram",
"min_gram":3,
"max_gram":15
}
}
}