当前位置: 首页 > 面试题库 >

Django Haystack通过Elasticsearch后端按距离排序,而不是geo_point字段错误

卫皓
2023-03-14
问题内容

我正在使用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(_ :modelresult)],从[0],大小[10],排序[]:查询失败[无法执行主查询]];
html" target="_blank">嵌套: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],大小[10],排序[]:查询失败[无法执行主查询]];
嵌套:ElasticSearchIllegalArgumentException [field [location]不是geo_point字段]; }]’。

怎么了?


问题答案:

您的位置字段的“类型”方面可能映射错误。这可能是由您用于映射的api引起的。映射中的某些方面可以更改,但字段的“类型”方面不能更改。因此,您必须使用geo_point类型的location字段创建一个新的映射,然后为您的文档重新编制索引。



 类似资料:
  • 问题内容: 我有以下模型: 我应如何查询以距离排序(距离为无穷大)? 如果需要,可以在PosgreSQL,GeoDjango上工作。 问题答案: 首先,最好使一个点字段而不是使lat和lnt分开: 然后,你可以像这样过滤它:

  • 我有一个用于使用elasticsearch GeopointSpring引导应用程序。当我保存弹性索引并创建geoDistanceQuery时,我得到了QueryShardException[未能找到geo_point字段[customer]]异常。 我的文件; 储存库; 保存和获取方法;

  • 问题内容: 我的方法有问题。例如,我有带有Text()的索引字段: 当我尝试执行带有排序的搜索查询时,出现错误: elasticsearch.exceptions.RequestError:TransportError(400,’search_phase_execution_exception’,’默认情况下,文本字段上的字段数据是禁用的。在[title]上设置fielddata = true以便

  • 我想按字段存在对我的ES搜索结果进行排序,假设我得到了字段“价格”,并希望所有有价格的结果都在顶部,所有没有价格的结果都在底部。我知道你可以做一个简单的排序并添加“缺失”:“_last”,例如: {“sort”:[{price':{missing':'u last',order':'asc'}}]} 但在这种情况下,结果也将按价格排序,我不想要它。 没有脚本有办法做到吗?

  • 我正在尝试一个mysql查询来根据距离排序帖子,比如说在半径250英里内,所有的工作都很好,除了我需要以一种方式排序帖子,特色帖子总是在顶部。这是我的mysql查询(我正在wordpress上做)。 问题是ORDER BY,它给我的错误是“Subquery returns多于1行” 如果删除ORDER BY(从wp_postmeta中选择wp_postmeta.meta_value,wp_post

  • 我正在运行Elasticsearch版本1.5.2。Logstash版本1.5.4。 大多数logstash设置都是默认的: 我检查了映射“http://localhost:9200/logstash-2015.09.15?pretty”,并且geoip.location映射为double而不是geo_point。 有什么建议如何正确地映射这个? 更多信息: