2011-09-09 31 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 

這應該是一個堅實的開始。希望這可以指導你正確的方向。

相關問題