Django中全文搜索(Full Text Search)的高级用法

2023-04-11 00:00:00 全文 用法 高级

在Django中实现全文搜索(Full Text Search)可以使用Django内置的搜索框架,也可以使用第三方库,如django-haystack和django-watson。其中,django-watson是一个轻量级的搜索库,可实现简单的全文搜索。下面是django-watson的高级用法。

安装django-watson库

首先需要安装django-watson库,可以使用pip安装:

pip install django-watson

或者从github下载,并通过python setup.py install 安装。

配置django-watson

在项目settings.py中配置:

INSTALLED_APPS = [
...
'watson',
...
]

MIDDLEWARE = [
...
'watson.middleware.SearchContextMiddleware',
...
]

在Django的model中的需要进行全文搜索的字段上添加WatsonSearchField。

例如,在models.py中定义一个Post模型:

from django.db import models
from watson import search as watson

class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
...

search_index = watson.SearchField(
    # 添加需要搜索的字段
    title = watson.CharField(model_attr='title'),
    content = watson.CharField(model_attr='content')
)

def __str__(self):
    return self.title

最后记得进行数据库迁移

python manage.py makemigrations
python manage.py migrate

搜索

使用django-watson进行搜索需要使用下面的方法:

from watson import search as watson

query = 'pidancode.com' # 搜索关键字
search_results = watson.search(query, models=[Post]) # 进行搜索,指定搜索的model

for result in search_results:
print(result.title)

如果查询的内容不在指定的model中,则不会返回任何结果。如果不指定model,则会在所有指定search_index的model中进行搜索。

详细配置

django-watson还提供了更多用于搜索和排序的配置。

  • 指定查询的内容

可以使用Query类型的内容指定搜索字段和关键字,而不是在搜索方法中传递字符串。

query = watson.SearchQuery()
query.add_wildcard('pidancode') # 指定需要匹配的关键字,在关键字的两端添加一个通配符

search_results = watson.search(query, models=[Post])

  • 在上下文中搜索

可以使用特定的文本和Query指定与查询相关的上下文,从而通过ContextSearch方法进行搜索。

context = watson.SearchContext()
context.add('pidancode', 'title')

query = watson.SearchQuery()
query.add_wildcard('pidancode')

search_results = watson.search(query, search_context=context, models=[Post])

  • 对搜索结果排序

可以使用order_by()方法对搜索结果进行排序。

query = watson.SearchQuery()
query.add_wildcard('pidancode')

search_results = watson.search(query, models=[Post]).order_by('-created_at')

标记搜索结果

可以使用watson.highlight()方法标记搜索结果中匹配的关键字。

query = watson.SearchQuery()
query.add_wildcard('pidancode')

search_results = watson.search(query, models=[Post])

for result in search_results:
print(result.title)
highlighted_content = watson.highlight(result.object.content, query)
print(highlighted_content)

更多详细信息可以查看django-watson的官方文档。

相关文章