【问题标题】:Can Haystack filter by a geodjango PointField?Haystack 可以通过 geodjango PointField 过滤吗?
【发布时间】:2011-11-13 23:13:09
【问题描述】:

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

from django.contrib.gis.db import models


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

【问题讨论】:

  • 更新:从 Haystack 2.0 开始,空间搜索已经实现,并且与 geodjango 字段配合得很好。
  • 嗨@Agabel。您能否发布任何有助于解决 Haystack 2.0 和 geodjango 问题的代码示例?谢谢!

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


【解决方案1】:

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

You should create a custom search form 从 SearchForm 或其他选项之一子类化(对我来说是 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

这应该是一个坚实的开始。希望这能为您指明正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2011-12-01
    • 2016-04-29
    • 2017-01-07
    • 2021-05-07
    • 2018-12-31
    相关资源
    最近更新 更多