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

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

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

最佳答案

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

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 来救援 GeoDjango Distance Queries 。通过距离查询,您可以选择如何过滤距离小于、大于等。以及距离本身,以您想要的任何单位。

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

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

关于python - Haystack 可以通过 geodjango PointField 进行过滤吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7365016/

相关文章:

python - 从 Django 服务器一次流式传输多个文件

python - 为 flask 记录器设置数据库处理程序

django - 如何在 Django 中使用 s3 到 base64 在 FileField 中编码文件?

python - 当没有摘录时显示消息 - Django 模板

search - 为什么我无法搜索标题包含 "latex"的帖子?

python - Sklearn ROC AUC 分数 : ValueError: y should be a 1d array, 得到了一个形状数组 (15, 2)

python - TfidfVectorizer NotFittedError

python - Django:在 models.py 中出错并迁移,尝试修复错误,但 django 在 models.py 中没有看到任何更改

MySQL 全文搜索总是有 0 个结果?

sql-server-2005 - 在 SQL Server 2005 中的 View 上创建全文索引