django 使用全局搜索功能的实例详解
作者:疯狂打码中 发布时间:2023-01-26 05:56:56
安装需要的包
1 第一步:
全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理。
haystack:全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎
whoosh:纯Python编写的全文搜索引擎对于小型的站点,whoosh已经足够使用
jieba:一款免费的中文分词包
1)在虚拟环境中依次安装需要的包。
pip install django-haystack
pip install whoosh
pip install jieba
2 注册app
INSTALLED_APPS = (
...
'haystack',
)
创建的models
class GoodInfo(models.Model):
message = models.CharField(max_length=100)
content = models.TextField()
def __str__(self):
return self.message
3 在settings 中配置搜索引擎
# 全文搜索引擎的配置
HAYSTACK_CONNECTIONS = {
'default': {
# 使用whoosh引擎
'ENGINE': 'haystack.backend.whoosh_cn_backend.WhooshEngine',
# 索引文件路径
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}
#当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
4 在项目的urls.py中添加搜索的配置。
url(r'^search/', include('haystack.urls')),
5 在创建的app目录下创建search_indexes.py 编写一下程序
from haystack import indexes
from .models import GoodInfo
# 对指定的某个类的某些数据建立索引
class GoodInfoIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return GoodInfo
def index_queryset(self, using=None):
return self.get_model().objects.all()
6 在templates目录下创建"search/indexes/app06/"目录。(app06 为自己创建的app的名称)
在文件夹中创建 "goodinfo_text.txt"文件。 (goodinfo 为自己创建的数据库的名称)
#指定索引的属性
{{object.content}} (content 为自己创建的表的一个字段 把这个字段指定为索引字段)
7 找到虚拟环境django下安装的haystack目录。
/home/python/.virtualenvs/django/lib/python2.7/site-packages/haystack/backends/
在上面的目录中创建ChineseAnalyzer.py文件。
import jieba
from whoosh.analysis import Tokenizer, Token
class ChineseTokenizer(Tokenizer):
def __call__(self, value, positions=False, chars=False,
keeporiginal=False, removestops=True,
start_pos=0, start_char=0, mode='', **kwargs):
t = Token(positions, chars, removestops=removestops, mode=mode,
**kwargs)
seglist = jieba.cut(value, cut_all=True)
for w in seglist:
t.original = t.text = w
t.boost = 1.0
if positions:
t.pos = start_pos + value.find(w)
if chars:
t.startchar = start_char + value.find(w)
t.endchar = start_char + value.find(w) + len(w)
yield t
def ChineseAnalyzer():
return ChineseTokenizer()
8)复制whoosh_backend.py文件,改为如下名称:
注意:复制出来的文件名,末尾会有一个空格,记得要删除这个空格。
whoosh_cn_backend.py
9)打开复制出来的新文件,引入中文分析类,内部采用jieba分词。
from .ChineseAnalyzer import ChineseAnalyzer
10)更改词语分析类。
查找
analyzer=StemmingAnalyzer()
改为
analyzer=ChineseAnalyzer()
11)初始化索引数据。
python manage.py rebuild_index
按照提示 输入 y 后 生成索引 在主目录下 会生成一个whoosh_index 文件夹 其中放置三个索引文件
配置好后 就该开始使用了
按照配置,在admin管理中添加数据后,会自动为数据创建索引,可以直接进行搜索,可以先创建一些测试数据。
1)在app06/views.py中定义视图query。
def query(request):
return render(request,'booktest/query.html')
2)在app06/urls.py中配置。
url(r'^query/', views.query),
3)在templates/app06/目录中创建模板query.html。
参数q表示搜索内容,传递到模板中的数据为query。
<html>
<head>
<title>全文检索</title>
</head>
<body>
<form method='get' action="/search/" target="_blank">( 提交的路径就是 在urls 中配置的)
<input type="text" name="q"> # (这里注意 input的name属性 必须是 q 不能改变)
<br>
<input type="submit" value="查询">
</form>
</body>
</html>
4)自定义搜索结果模板:在templates/search/目录下创建search.html。
搜索结果进行分页,视图向模板中传递的上下文如下:
(这个上下文 是 搜素引擎自动给返回的 不需要我们自己去写视图函数来进行返回 直接进行使用就可以)
query:搜索关键字
page:当前页的page对象
paginator:分页paginator对象
视图接收的参数如下:
参数q表示搜索内容,传递到模板中的数据为query
参数page表示当前页码
<html>
<head>
<title>全文检索--结果页</title>
</head>
<body>
<h1>搜索 <b>{{query}}</b> 结果如下:</h1>
<ul>
{%for item in page%} (注意这里面的对象的获取方式 )
<li>{{item.object.id}}--{{item.object.content|safe}}</li>
{%empty%}
<li>啥也没找到</li>
{%endfor%}
</ul>
<hr>
{%for pindex in page.paginator.page_range%} (后面的是返回的是全部的页码)
{%if pindex == page.number%} (page.number) 返回的是当前的页码
{{pindex}}
{%else%} (按照页码进行翻页的时候 也要注意 这样的翻页方式)
<a href="?q={{query}}&page={{pindex}}" rel="external nofollow" >{{pindex}}</a>
{%endif%}
{%endfor%}
</body>
</html>
5)运行服务器,在浏览器中输入如下地址:
http://127.0.0.1:8000/query/
来源:https://blog.csdn.net/Demo_3/article/details/74154280
猜你喜欢
- 本文实例讲述了JS基于面向对象实现的选项卡效果。分享给大家供大家参考,具体如下:中间过渡环节:把面向过程的程序,改写成面向对象的形式<
- 本文实例讲述了python连接远程ftp服务器并列出目录下文件的方法。分享给大家供大家参考。具体如下:这段python代码用到了pysftp
- 为了实现Nao机器人与电脑端的TCP通信,于是研究了一下Python实现TCP通信,在网上也看到了很多例子,但大多都是在一台机器上验证。在两
- 1.匿名函数介绍匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。在pytho
- 1. 写在前面今天整理OpenCV入门的第三个实战小项目,前面的两篇文章整理了信用卡数字识别以及文档OCR扫描, 大部分用到的是OpenCV
- 二维码的分类线性堆叠式二维码矩阵式二维码二维码的优缺点优点信息容量大编码范围广容错能力强译码可靠性高可引入加密措施成本低,易制作缺点二维码技
- Django项目中为什么会加载静态时会失败呢?原因:django部署方式比较特别,采用静态文件路径:STATICFILES_DIRS的部署方
- 前言:PyPDF2是一个纯Python的开源库,能够分割或合并PDF文件,也可以裁剪或转换PDF文件中的页面。我们还可以使用PyPDF2查看
- python sys模块包含了与python解释器和它的环境有关的函数,这个你可以通过dir(sys)来查看他里面的方法和成员属性impor
- 前言今天就给大家介绍四个你不怎么常用排序函数,他们就是SQL Server排序中经常用到的ROW_NUMBER(),RANK(),DENSE
- 问题描述利用栈的数据结构实现将十进制数转换成二进制数C语言实现顺序表的存储结构实现栈代码:#include <stdlib.h>
- MySQL 触发器MySQL 数据库中触发器是一个特殊的存储过程,不同的是执行存储过程要使用 CALL 语句来调用,而触发器的执行不需要使用
- FCKeditor为一开源多功能在线Web编辑器。官方网站:http://www.fckeditor.net/。相关安全文件参看:《在.ne
- 本文只讨论Oracle中最常见的索引,即是B-tree索引。本文中涉及的数据库版本是Oracle8i。 一. 查看系统表中的用户索引 在Or
- 这篇文章主要介绍了python中的引用和拷贝实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 在数据处理的时候,尤其在搞大数据竞赛的时候经常会遇到一个问题就是,多个表单的合并问题,比如一个表单有user_id和age这两个字段,另一个
- 本文分析了mysql登录报错提示:ERROR 1045 (28000)的解决方法。分享给大家供大家参考,具体如下:一、问题:公司linux系
- 前言:问题分析:在进行数据库查询的时候,我们都知道索引可以加快数据查询的效率。但是在实际的业务场景下,经常会遇到即使在表中增加了索引,但是同
- javascript中一个标识符所在的位置越深,它的读写速度也越慢。因此,函数中读写局部变量总是最快的,而读写全局变量通常是最慢的。一个好的
- 网上下载的 pdf 学习资料有一些会带有水印,非常影响阅读。比如下面的图片就是在 pdf 文件上截取出来的。安装模块PIL:Python I