我正在使用django 1.4,django-haystack 2.0和Elasticsearch 0.19.1我有一个像这样的SearchIndex:
from haystack import indexes
from core.models import Project
class ProjectIndex(indexes.RealTimeSearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
location = indexes.LocationField(model_attr='get_location')
def get_model(self):
return Project
和那样的项目模型:
class Project(BaseModel):
name = models.CharField(_(u'Proje Adı'), max_length=50)
latitude = models.FloatField()
longitude = models.FloatField()
def get_location(self):
# Remember, longitude FIRST!
return Point(self.longitude, self.latitude)
所以我想通过距离特定坐标从近到远查询Project对象:
....
location = Point(project.longitude, project.latitude)
projects = SearchQuerySet().models(Project).distance('location', location).order_by('distance')
但是我收到了这个错误:
无法使用':'查询Elasticsearch:返回的非OK状态代码(500)包含u'SearchPhaseExecutionException [无法执行阶段[查询],完全失败; shardFailures {[jmUkmHkDTX-bo9DhFJdtSw] [skp] [2]:QueryPhaseExecutionException [[skp] [2]:query [filtered(ConstantScore(NotDeleted(cache(QueryWrapperFilter(django_ct:core.project))))) - > cache( _type:modelresult)],从[0],size [10],sort []:查询失败[无法执行主查询]];嵌套:ElasticSearchIllegalArgumentException [field [location]不是geo_point字段]; } {[jmUkmHkDTX-bo9DhFJdtSw] [skp] [4]:QueryPhaseExecutionException [[skp] [4]:query [filtered(ConstantScore(NotDeleted(cache(QueryWrapperFilter(django_ct:core.project))))) - > cache( _type:modelresult)],从[0],size [10],sort []:查询失败[无法执行主查询]];嵌套:ElasticSearchIllegalArgumentException [field [location]不是geo_point字段]; }]”。
有什么问题?
答案 0 :(得分:4)
您的位置字段的“类型”方面可能映射错误。这可能是由您用于映射的api引起的。可以更改映射中的某些方面,但不能更改字段的“类型”方面。因此,您必须在geo_point类型中创建一个包含location字段的新映射,并重新索引您的文档。