Haystack可以通过geodjango PointField过滤吗?

时间:2011-09-09 17:00:35

标签: python django full-text-search geodjango django-haystack

我希望能够使用django-haystack对模型进行全文搜索。该模型使用PointField来存储坐标。我想根据距离点的距离来过滤搜索结果。干草堆有可能吗?有更好的方法吗?

from django.contrib.gis.db import models


class Listing(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField()
    location = models.PointField()

1 个答案:

答案 0 :(得分:3)

听起来您希望用户将地理信息(如地址或邮政编码)输入到文本搜索中。这就是我做到的,虽然我不确定它是如何扩展的。我刚刚在5分钟前完成了这个。

来自SearchForm的

You should create a custom search form或其他选项之一(对我而言,它是FacetedSearchForm)。覆盖搜索方法。

首先将搜索字符串转换为一个点。 http://code.google.com/p/geopy/wiki/GettingStarted

class MainSearchForm(FacetedSearchForm):

    def search(self):

        query = self.cleaned_data['q']
        g = geocoders.Google()
        place, (lat, lng) = g.geocode('%s' % query)
        pnt = fromstr('POINT(%s %s)' % (lng, lat), srid=4326)

然后使用搜索查询集,我使用RelatedSearchQuerySet因为它允许你使用load_all_queryset(),这是我按距离过滤的地方。用GeoDjango Distance Queries来救援GeoDjango。通过距离查询,您可以选择如何过滤距离小于,大于等距离以及距离本身,无论您想要的任何单位。

        sqs = RelatedSearchQuerySet().load_all()
        sqs = sqs.load_all_queryset(Listing, 
                                    Listing.objects.filter(location__distance_lte=(pnt, D(mi=20))))
        return sqs

这应该是一个坚实的开端。希望这能指出你正确的方向。