使用Django的全文Postgresql搜索来匹配短语

时间:2019-03-25 12:10:46

标签: django

我正在成功使用Django的full text search。但是,我想匹配引用的短语,看不到该怎么做。

例如,我有一个模型:

from django.contrib.postgres.indexes import GinIndex
from django.contrib.postgres.search import SearchVectorField
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    search_document = SearchVectorField(null=True)

    class Meta:
        indexes = [
            GinIndex(fields=['search_document'])
        ]

我已经做到了:

from django.contrib.postgres.search import SearchVector

Article.objects.update(
    search_document=(
        SearchVector('title', weight='A') \
        + SearchVector('body', weight='B')
    )
)

但是,如果我搜索:

  

“美味苹果”鱼

像这样:

from django.contrib.postgres.search import SearchQuery

qs = Article(
        search_document=SearchQuery('"tasty apples" fish'))

然后结果与我搜索的结果相同

  

美味的苹果鱼

即包含这三个词的文章,而不是包含“美味苹果”和“鱼”一词的文章。

是否可以搜索这样的短语?

1 个答案:

答案 0 :(得分:0)

Django即将发布的新版本2.2将提供a search type "phrase"。 您可以研究一下如何在Django 2.2的SearchQuery class中生成SQL,并在无法尽快升级的情况下将其反向移植到Django版本。

Postgresql documentation中提供了文本搜索功能的列表。