В настоящее время я запускаю стог сена с помощью elasticearch backend, и теперь я создаю автозаполнение имен городов. Проблема в том, что SearchQuerySet дает мне разные результаты, которые с моей точки зрения ошибочны, чем тот же запрос, выполненный непосредственно в elasticsearch, для меня ожидаемые результаты.
Я использую: Django 1.5.4, django-haystack 2.1.0, pyelasticsearch 0.6.1, elasticsearch 0.90.3
Используя следующие данные примера:
- Полузащитник
- Мидленд-Сити
- Midway
- Незначительный
- Minturn
- Майами-Бич
Используя
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", и поэтому она возвращает неверные результаты.
Я не уверен, что я делаю или что-то неправильно понимаю, и если это так, как должен работать стог сена, но мне нужно, чтобы результаты сена совпадали с результатами elasticsearch.
Итак, как я могу исправить проблему или заставить ее работать?
Мои обобщенные объекты выглядят следующим образом:
Модель:
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
Mapping:
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"
}
}
}
Спасибо.