2011-09-09 34 views
2

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

from django.contrib.gis.db import models 


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

更新:自Haystack 2.0开始,空间搜索已经实现,并且与geodjango领域的工作很好。 – agabel

+0

Hi @ Agabel。你可以发布任何代码样本,帮助解决Haystack 2.0和geodjango的问题吗?谢谢! –

回答

3

这听起来像你希望用户输入地理信息,如地址或邮编到文本搜索。这是我做到的,尽管我不确定它是如何缩放的。我刚刚在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与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 

这应该是一个坚实的开始。希望这可以指导你正确的方向。

相关问题