Может ли Haystack фильтровать по геоджанго PointField? - PullRequest
2 голосов
/ 09 сентября 2011

Я хочу использовать 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()

1 Ответ

3 голосов
/ 10 сентября 2011

Звучит так, будто вы хотите, чтобы пользователи вводили географическую информацию, например адрес или почтовый индекс, в текстовый поиск.Это то, как я это сделал, хотя пока не уверен, как оно масштабируется.Я только что закончил это 5 минут назад.

Вы должны создать пользовательскую форму поиска с подклассами из 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

Это должно быть надежное начало.Надеюсь, это направит вас в правильном направлении.

...