Haystack 可以通过 geodjango PointField 进行过滤吗?

发布于 2024-12-03 19:44:21 字数 323 浏览 2 评论 0原文

我希望能够使用 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()

I want to be able to use django-haystack to do full text searches on a model. This model uses a PointField to store coordinates. I want to filter the results of a search based on the distance from a point. Is this possible with Haystack? Is there a better way to do this?

from django.contrib.gis.db import models


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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

秋日私语 2024-12-10 19:44:21

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

您应该创建一个自定义搜索表单,它是 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 可以通过 GeoDjango 距离查询< /a>.通过距离查询,您可以选择如何过滤距离小于、大于等。以及距离本身,以您想要的任何单位。

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

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

It sounds like you want users to input geographic information, like an address or zipcode into the text search. This is how I did it, though I'm not sure how it scales yet. I just finished this 5 minutes ago.

You should create a custom search form subclassed from SearchForm or one of the other options (for me it was FacetedSearchForm). Overwrite the search method.

First turn the search string into a point. 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)

Then take the search query set, I used RelatedSearchQuerySet since it allows you to use load_all_queryset() which is where I filtered by distance. It's GeoDjango to the rescue with GeoDjango Distance Queries. With the distance query, you can choose how to filter with distance less than, greater than etc. And the distance itself, in whatever units you want.

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

That should be a solid start. Hope this points you in the right direction.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文