Django中全文搜索(Full Text Search)的高级用法
在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的官方文档。
相关文章