我目前正在运行带有弹性搜索后端的haystack,现在我正在为城市名称构建自动完成功能.问题是SearchQuerySet给了我不同的结果,从我的角度来看是错误的,而不是直接在elasticsearch中执行的相同查询,这对我来说是预期的结果.
我正在使用:Django 1.5.4,django-haystack 2.1.0,pyelasticsearch 0.6.1,elasticsearch 0.90.3
使用以下示例数据:
中场
米德兰市
中途
次要
明特恩
迈阿密滩
使用其中之一
SearchQuerySet().models(Geoname).filter(name_auto='mid') or SearchQuerySet().models(Geoname).autocomplete(name_auto='mid')
结果总是返回所有6个名称,包括Min*和Mia*...但是,查询elasticsearch会直接返回正确的数据:
"query": { "filtered" : { "query" : { "match_all": {} }, "filter" : { "term": {"name_auto": "mid"} } } } { "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 3, "max_score": 1, "hits": [ { "_index": "haystack", "_type": "modelresult", "_id": "csi.geoname.4075977", "_score": 1, "_source": { "name_auto": "Midfield", } }, { "_index": "haystack", "_type": "modelresult", "_id": "csi.geoname.4075984", "_score": 1, "_source": { "name_auto": "Midland City", } }, { "_index": "haystack", "_type": "modelresult", "_id": "csi.geoname.4075989", "_score": 1, "_source": { "name_auto": "Midway", } } ] } }
不同的例子的行为是相同的.我的猜测是,通过所有可能的"min_gram"字符组分割和分析字符串干草堆,这就是它返回错误结果的原因.
我不确定我是在做什么还是在理解错误,如果这是干草堆应该如何工作,但我需要干草堆结果与弹性搜索结果相匹配.
那么,我该如何解决问题或使其有效?
我的总结对象如下所示:
模型:
class Geoname(models.Model): id = models.IntegerField(primary_key=True) name = models.CharField(max_length=255)
指数:
class GeonameIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) name_auto = indexes.EdgeNgramField(model_attr='name') def get_model(self): return Geoname
制图:
modelresult: { _boost: { name: "boost", null_value: 1 }, properties: { django_ct: { type: "string" }, django_id: { type: "string" }, name_auto: { type: "string", store: true, term_vector: "with_positions_offsets", analyzer: "edgengram_analyzer" } } }
谢谢.