Django项目中配置全文检索
Django项目中配置全文检索
之前我们需要查询匹配数据的时候,只能使用模糊查询,这种查询方式效率低下,在企业开发中是不能使用的。在真正的企业级 web 项目,都需要一些基于全文检索的框架或者 工具模块(如 Lucene、Whoosh、Xapian、Elasticsearch、solr 等) ,不同于特定字段的模糊 查询,全文检索的效率更高,并且能够对于中文进行分词处理。
Django Haystack 简介
Django 为开发者提供了一个 haystack 的模块,用于支持全文检索。
➢ Django 的一个包,一种全文检索的框架,可以方便地对 model 里面的内容进行索引、 搜索。
➢ 为 Django 提供了模块化的搜索,它提供一个统一的、友好的 API,允许您插入不同 的搜索后端(如 Solr、Elasticsearch、Whoosh、Xapian 等等),而不需要修改代码。
➢ 支持 whoosh、solr、Xapian、Elasticsearch 四种全文检索引擎后端。 本案例中使用 whoosh 这个全文检索引擎。
以下站点为django建站,专注分享python相关技术。
python相关技术圈--> http://www.ofus.ink
原文地址:http://www.ofus.ink/articles/article/47/
必要依赖
要使用 django haystack,首先必须安装它,并且安装一些必要的依赖。
Whoosh:一个全文检索引擎
纯 Python 编写的全文搜索引擎,虽然性能比不上 sphinx、xapian、Elasticsearc 等, 但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh 已经足够使用。
Jieba:一款免费的中文分词包
把句子拆开分成一个一个的词语,这样能更好的分析句子的特性,这个过程叫做分词。
Whoosh: 虽然提供了分词功能,但是这个一个国外引擎,对于中文的支持并不太好, 所以我们使用一个对于中文比较友好的分词工具 —— jieb 分词工具 。
环境安装
pip install django-haystack
pip install whoosh
pip install jieba
注意:jieba 包在 https://pypi.org/project/jieba/,如果下载失败,可能需要科学上网哦。 当然如果报错,也可以多次下载试试。
配置
修改setting.py.
添加haystack到 INSTALLED_APPS中
INSTALLED_APPS = [
……
'haystack',
……
]
添加whoosh到setting.py中
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'mysearch.whoosh_cn_backend.WhooshEngine', # mysearch 与下方创建索引类 app名字一致
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}
添加索引生成设置 到setting.py中
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
添加 分页设置 到setting.py中
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10
以下站点为django建站,专注分享python相关技术。
python相关技术圈--> http://www.ofus.ink
原文地址:http://www.ofus.ink/articles/article/47/
创建索引类
创建一个 App 应用,如 mysearch(与上面whoosh设置名字一致)。
django-admin startapp mysearch
在该应用目录下建立 search_indexes.py(注意:该 名称不能取其他名称,必须是这个)文件。
在 setting 文件中注册该应用:
INSTALLED_APPS = [
……
'mysearch',
……
]
在search_indexes.py文件中写入以下代码:
from haystack import indexes
from articles.models import Article # 引入需要检索的model
class ArticleIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return Article
def index_queryset(self, using=None):
return self.get_model().objects.all()
设置数据模板
在根目录“templates/search/indexes/应用名称/”下创建“模型类名称_text.txt”文件:
该文件规定了模型类的检索规则:
{{ object.title }}
{{ object.content }}
这里列出了要对哪些列的内容进行检索,这个数据模板的作用是对 Article.content、 Article.title 这两个字段建立索引,当检索的时候会对这两个字段做全文检索匹配,然后将匹 配的结果排序后作为搜索结果返回。
在根项目的 urls.py 中添加 url
urlpatterns = [
......
url(r'^search/',include("haystack.urls")), # 配置检索的路由
]
创建搜索结果页面
在根目录“templates/search/”下建立 search.html,aystack_search 视图函数会将搜索结果 传递给模板 search/search.html。
以下站点为django建站,专注分享python相关技术。
python相关技术圈--> http://www.ofus.ink
原文地址:http://www.ofus.ink/articles/article/47/
写入搜索视图模板
<html>
<head>
<title></title>
</head>
<body>
{% if query %}
<h3>为您找到相匹配的内容:</h3>
{% for result in page.object_list %}
<a href="/articles/article/{{ result.object.id }}/"> {{ result.object.title }} </a><br/>
{% empty %}
<p>啥也没找到</p>
{% endfor %}
{% if page.has_previous or page.has_next %}
<div>
{% if page.has_previous %}
<a href="?q={{ query }}&page={{ page.previous_page_number }}">
{% endif %}
« 上一页
{% if page.has_previous %}</a>
{% endif %} | {% if page.has_next %}
<a href="?q={{ query }}&page={{ page.next_page_number }}">
{% endif %} 下一页 » {% if page.has_next %}
</a>
{% endif %}
</div>
{% endif %}
{% endif %}
</body>
</html>
修改搜索引擎为中文分词
我们前面说过了 whoosh 的分词对于中文不太友好,所以我们修改分词工具为 jieba 分 词;
复制 Lib\site-packages\haystack\backends\whoosh_backend.py 文件,粘贴到应用目 录下(这里是 mysearch)改名为 whoosh_cn_backend.py。
进行写入:
from jieba.analyse import ChineseAnalyzer
查找 analyzer=StemmingAnalyzer()
改为 analyzer=ChineseAnalyzer()
生成索引
初始化索引数据:
python manage.py rebuild_index
在模板中创建搜索栏
<form class="navbar-form navbar-left" method='get' action="/search/" target="_blank">
<div class="form-group">
<input type="text" class="form-control" name="q" placeholder="键入关键词 回车检索">
<span class="glyphicon glyphicon-search" aria-hidden="true" style="margin-left: -30px;line-height:34px;"></span>
<input type="submit" value="查询" hidden>
</div>
</form>
测试
在这里,它会把标题和内容包含 你 的数据全部渲染到页面上。
因为,我们在设置数据模板的时候定义了 模型类名称_text.txt 的内容。
你可以随意的修改这个页面的样式,满足你的审美或需求。
至此,我们已经完成了对网站的全文检索。
以下站点为django建站,专注分享python相关技术。
python相关技术圈--> http://www.ofus.ink
原文地址:http://www.ofus.ink/articles/article/47/