Django中的PostgreSQL文本搜索无法正常工作。

问题描述 投票:0回答:1

我正在为我的API实现一个搜索功能,以便在请求时返回对象的属性。到目前为止,我已经尝试使用 全文检索 它是可以使用的,但它有这些恼人的地方:单词必须拼写正确才能返回结果,而且部分搜索,例如 "appl "而不是 "apple",无法使用。我也试过 卦象相似性 但对于长句子却失败了。如何在Django中实现一个既准确又模糊的搜索功能?

这个方法可行

enter image description here

这不行

enter image description hereenter image description here

这是我的 视图.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)
django python-3.x postgresql django-rest-framework full-text-search
1个回答
2
投票

搜索查询 文档资料。

搜索查询 将用户提供的术语转化为数据库与搜索向量相比较的搜索查询对象。默认情况下,用户提供的所有词汇都会通过词干算法,然后它寻找所有结果词汇的匹配。

如果 搜索类型默认情况下,这些术语被视为单独的关键字。如果 搜索类型词组,这些术语被视为一个单一的短语。如果 搜索类型'原始'的然后你可以提供一个带有术语和运算符的格式化搜索查询。

在上面的代码中 搜索查询 的搜索词 "一只金发碧眼的哈士奇" 被翻译成类似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,就像我链接的文档中描述的那样。

如果你想进一步深入了解,你可以阅读一篇文章。文章 我写的关于这个问题。

"在Django中使用PostgreSQL进行全文检索。"

© www.soinside.com 2019 - 2024. All rights reserved.