Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django全文搜索:如何组合多个查询和向量?_Python_Django_Full Text Search_Geodjango - Fatal编程技术网

Python Django全文搜索:如何组合多个查询和向量?

Python Django全文搜索:如何组合多个查询和向量?,python,django,full-text-search,geodjango,Python,Django,Full Text Search,Geodjango,我有一个包含三个输入的表单:类别,位置,和关键字 如果表单中填写了所有三个字段,则结果的关系应为ADD,否则将仅通过位置获取结果 我一直在尝试将这三种输入组合起来进行Django全文搜索,但它只获取与位置匹配的结果 以下是我的views.py代码: class SearchServices(generic.ListView): model = Service context_object_name = 'services' template_name = 'service

我有一个包含三个输入的表单:
类别
位置
,和
关键字

如果表单中填写了所有三个字段,则结果的关系应为
ADD
,否则将仅通过
位置
获取结果

我一直在尝试将这三种输入组合起来进行Django全文搜索,但它只获取与
位置匹配的结果

以下是我的views.py代码:

class SearchServices(generic.ListView):
    model = Service
    context_object_name = 'services'
    template_name = 'services/search.html'

    def get_queryset(self):
        qs = Service.objects

        if self.request.GET['location'] != '':
            lat_long = self.request.GET['location'].split(',')
            user_location = Point(float(lat_long[1]), float(lat_long[0]), srid=4326)

        keywords = self.request.GET['keywords']
        category = self.request.GET['category']

        query = SearchQuery(keywords) & SearchQuery(category)
        vector = SearchVector('title', 'description', StringAgg('tag__name', delimiter=' ')) + SearchVector(StringAgg('category__slug', delimiter=' '))
        if self.request.GET['location'] != '':
            qs = qs.filter(location__distance_lte=(user_location, D(km=2)))
        if category != '':
            qs = qs.annotate(search=vector).filter(search=query).distinct()
            qs = qs.annotate(rank=SearchRank(vector, query)).order_by('-rank')
        qs = qs.annotate(distance=Distance('location', user_location)).order_by('distance')

        return qs

任何关于我在这里做错了什么的指点都将不胜感激。

我认为您的问题与上一个注释行中未定义的用户位置有关。试着这样做:

class SearchServices(generic.ListView):
    model = Service
    context_object_name = 'services'
    template_name = 'services/search.html'

    def get_queryset(self):
        qs = Service.objects.all()

        request_location = self.request.GET.get('location', '')
        request_keywords = self.request.GET.get('keywords', '')
        request_category = self.request.GET.get('category', '')

        query = SearchQuery(request_keywords) & SearchQuery(request_category)

        vector = SearchVector(
            'title',
            'description',
            StringAgg('tag__name', delimiter=' ')
        ) + SearchVector(
            StringAgg('category__slug', delimiter=' ')
        )

        if request_category != '':
            qs = qs.annotate(search=vector).filter(search=query).distinct()
            qs = qs.annotate(rank=SearchRank(vector, query)).order_by('-rank')

        if len(request_location.split(',')) == 2:
            lat_long = request_location.split(',')
            user_location = Point(float(lat_long[1]), float(lat_long[0]), srid=4326)
            qs = qs.filter(location__distance_lte=(user_location, D(km=2)))
            qs = qs.annotate(
                distance=Distance('location', user_location)
            ).order_by('distance')

        return qs