我正在为我的API实现一个搜索功能,以便在请求时返回对象的属性。到目前为止,我已经尝试使用 全文检索 它是可以使用的,但它有这些恼人的地方:单词必须拼写正确才能返回结果,而且部分搜索,例如 "appl "而不是 "apple",无法使用。我也试过 卦象相似性 但对于长句子却失败了。如何在Django中实现一个既准确又模糊的搜索功能?
这个方法可行
这不行
这是我的 视图.py
from django.shortcuts import render
from rest_framework.response import Response
from rest_framework import status
from rest_framework.decorators import api_view
from .models import Object_Locations
from .serializers import Object_LocationsSerializer
from django.contrib.postgres.search import SearchVector, SearchQuery
def index(request):
return render(request, 'main/base.html', {})
@api_view(['GET',])
def LocationsList(request):
if request.method == 'GET':
vector = SearchVector('name', 'desc', 'catergory')
query = request.GET.get('search')
if query:
locations = Object_Locations.objects.annotate(search=vector,).filter(search=SearchQuery(query))
else:
locations = Object_Locations.objects.all()
serializer = Object_LocationsSerializer(locations, many=True)
return Response(serializer.data)
从 搜索查询 文档资料。
搜索查询 将用户提供的术语转化为数据库与搜索向量相比较的搜索查询对象。默认情况下,用户提供的所有词汇都会通过词干算法,然后它寻找所有结果词汇的匹配。
如果 搜索类型 是 岙默认情况下,这些术语被视为单独的关键字。如果 搜索类型 是 词组,这些术语被视为一个单一的短语。如果 搜索类型 是 '原始'的然后你可以提供一个带有术语和运算符的格式化搜索查询。
在上面的代码中 搜索查询 的搜索词 "一只金发碧眼的哈士奇" 被翻译成类似SQL代码。
... @@ plainto_tsquery('a blac husky') ...
所以如果你想得到类似的搜索词组的结果 就可以将查询词组合在一起
from django.contrib.postgres.search import SearchQuery, SearchVector
from django.shortcuts import render
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Object_Locations
from .serializers import Object_LocationsSerializer
def index(request):
return render(request, 'main/base.html', {})
@api_view(['GET',])
def LocationsList(request):
if request.method == 'GET':
vector = SearchVector('name', 'desc', 'catergory')
query_terms = request.GET.get('search')
query_raw = ' | '.join(query_terms.split())
query = SearchQuery(query_raw, search_type='raw')
if query.value:
locations = Object_Locations.objects.annotate(search=vector).filter(search=query)
else:
locations = Object_Locations.objects.all()
serializer = Object_LocationsSerializer(locations, many=True)
return Response(serializer.data)
在上面的代码中 搜索查询 的搜索词 "一只金发碧眼的哈士奇" 被翻译成类似SQL代码。
... @@ plainto_tsquery('a | blac | husky') ...
可以使用逻辑操作来组合SearchQuery,就像我链接的文档中描述的那样。
如果你想进一步深入了解,你可以阅读一篇文章。文章 我写的关于这个问题。