Django-haystack无法索引位置字段

时间:2014-01-23 11:36:39

标签: python django solr django-haystack

我正在尝试用django-haystack索引一堆地址。我的搜索索引是:

class AddressIndex(indexes.SearchIndex, indexes.Indexable):
    street = indexes.CharField(model_attr='street')
    city = indexes.CharField(model_attr='city')
    location = indexes.LocationField(null=True)

    def prepare_location(self, obj):
        try:
            return obj.location.point
        except AttributeError:
            return None

    def get_model(self):
        return Address

searchindex当然有更多字段,但这就足够了。当我尝试通过运行./manage.py update_index -k4 -b100 -v2 location(索引存储在位置应用程序中)来对此进行索引时,只要prepare_location返回None,一切都会变得很好。一旦它返回一些东西(例如点0.000,0.000),我就会从Solr那里得到一个错误,提到一些不兼容的尺寸。

确切的错误是org.apache.solr.common.SolrException: com.spatial4j.core.exception.InvalidShapeException: incompatible dimension (2) and values (POINT (0.0000000000000000 0.0000000000000000)). Only 0 values specified。我想“也许它不喜欢这一点”,并在point.xpoint.y添加了0.0000000000000001,但错误保持不变(除了现在它提到了新的坐标)。

有人知道这里发生了什么吗?

我正在使用:

  • Python 2.7.5+(是的,它实际上是说当我运行python --version时)
  • Django 1.5.2
  • django-haystack 2.1.0
  • Solr 4.3.0
  • pysolr 3.1.0

在安装了所有最新更新的Ubuntu 13.10上。

1 个答案:

答案 0 :(得分:1)

显然django-haystack本身并没有做一个特别重要的事情。它没有将GeoDjango Point转换为所需的" lat,lon" format,但只是将Point对象传递给XML文档。

所以不要这样做:

def prepare_location(self, obj):
    try:
        return obj.location.point
    except AttributeError:
        return None

需要这样做:

def prepare_location(self, obj):
    try:
        return "{lat},{lon}".format(lat=obj.location.point.y, obj.location.point.x)
    except AttributeError:
        return None

如果我只是read the documentation,那将会变得更加轻松......