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