【发布时间】:2013-08-13 01:20:16
【问题描述】:
目前我们使用 Django Haystack 和 Solr,但现在我们想将 Search Backend 切换到 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 并做同样的事情,但我们卡住了,因为我们无法像在 Solr 中那样配置 Ngram 字段。 所以它总是不能正确匹配。
这意味着什么。 我们目前索引我们的模型 ID,因为每个模型都以大于 10000 的 ID 开头,所以当我在搜索 10001 之前,我会得到 ID 为 10001 的模型(即使使用 NGram) 在 ElasticSearch 上我什么也没得到,它只是找不到任何东西。 我怎么能这样。
【问题讨论】:
-
如果我理解正确,您会在“文本”字段的模板中呈现 id 吗?您应该在 search_index 中放入一个不是 ngram 的专用 obj_id 字段,以便进行精确搜索。
标签: elasticsearch django-haystack