whoosh读取+html,django-haystack+jieba+whoosh实现全文检索
写在前面
电商网站,免不了用户搜索商品,根据一般的思路是mysql的模糊匹配或者正则匹配,但是这种方法不仅效率低下,而且对于某些分词处理也很难处理,本文讲解简单的实现全文检索,利用django-haystack+jieba+whoosh,话不多说,进入正题。
全文检索
全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理
haystack:全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎
whoosh: 纯python写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙崩溃,对于小型的站点,whoosh已经足够使用
jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品
1、安装包
在虚拟环境中一次安装需要的包
pip install django-haystack
pip install whoosh
pip install jieba
2、修改配置
1、修改 Yourproject/settin.py 文件,安装应用haystack
INSTALLED_APPS = [
...
'haystack', #全文检索
]
2、全文检索框架配置
HAYSTACK_CONNECTIONS = {
'default': {
# 使用whoosh引擎
'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
# 索引文件路径
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
# 这个文件夹也不需要自己建立,会自动生成
}
}
# 指定如何对搜索结果分页,这里设置为每 10 项结果为一页。
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10
# 指定什么时候更新索引,这里我们使用 haystack.signals.RealtimeSignalProcessor,作用是每当有商品更新时就更新索引。由于商品更新不会太频繁,因此实时更新没有问题。
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
3、改变分词方式步骤1:建立ChineseAnalyzer.py文件
保存在haystack的安装文件夹下,路径如下
cd path_to_virtualenv/lib/python3.6/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()
4、改变分词方式步骤2:复制whoosh_backend.py文件,改名为whoosh_cn_backend.py
# 刚才的路径下
cp whoosh_backend.py whoosh_cn_backend.py
在whoosh_cn_backend.py文件中添加:
#添加
from haystack.backends.ChineseAnalyzer import ChineseAnalyzer
并修改:
最好将原来的注释掉,再复制一行改成自己的。
# 将文件中的
analyzer=StemmingAnalyzer()
改为
analyzer=ChineseAnalyzer()
3、索引文件的生成
在应用目录(即要设为检索关键字的应用目录下)下新建一个search_indexes.py文件(名字是固定的不能改),我这里是goods目录下面的。
from haystack import indexes
#引入你项目下的model(也就是你要将其作为检索关键词的models)
from goods.models import GoodsSKU
# 指定对于摸个类的某些数据建立索引
# 索引类名格式:模型类型+Index
class GoodsSkuIndex(indexes.SearchIndex, indexes.Indexable):
# 索引字段
# use_template=True:指定根据表中的哪些字段建立索引文件,把说明放在一个文件中
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
# 返回你的模型类
return GoodsSKU
# 建立索引的数据
def index_queryset(self, using=None):
return self.get_model().objects.all()
4、创建“模型类名称_text.txt”文件
在目录”templates/search/indexes/应用名称/”下创建”模型类名称小写_text.txt”文件(我建立的是goodssku_text.txt),这个模板的作用是让text字段包含的内容,在后面的模板中可能会有用。
# 指定根据表中的哪些字段建立索引数据
{{ object.name }} # 根据商品的名称建立索引
{{ object.desc }} # 根据商品的简介简历索引
{{ object.goods.detail }} # 根据商品的详情简历索引
5、配置路由
在本项目(不是某个应用)的urls.py中配置检索结果返回的地址
from django.urls import path, include
urlpatterns = [
# 其它path设置
path(r'search/', include('haystack.urls')),
# django小于 2.0版本的用以下的url
# url(r'^search/', include('haystack.urls')),
]
6、创建search.html
haystack 会把搜索出来的结果传递给 templates/search.html,传递的上下文包括:
query: 搜索关键字
page: 当前页的page对象 --> 遍历page对象,获取到的是 SearchResult: # 对象的属性object才模型类的对象
paginator: 分页paginator对象
在目录”templates/search/”下建立search.html作为检索结果返回的页面(可自己进行定制)
{%extends 'base_detail_list.html'%}
{% block title %}天天生鲜-商品搜索结果列表{% endblock title %}
{% block main_content %}
{{ query }}
>
{{ type.name }}
>
搜索结果如下:
{% for item in page %}
{{ item.object.name }}
¥{{ item.object.price }}
{{ item.object.unite }}
{% if request.session.user_name|default:'' != '' %}
{% else %}
{% endif %}
{%endfor%}
{% if page.has_previous %}
{% endif %}
{%for pindex in paginator.page_range%}
{%if pindex == page.number%}
{{pindex}}
{%else%}
{{pindex}}
{%endif%}
{%endfor%}
{% if page.has_next %}
下一页>
{% endif %}
whoosh读取+html,django-haystack+jieba+whoosh实现全文检索相关推荐
- Django+haystack+jieba进行全文检索
最近,在做一个全文检索的功能,找了两个方案: mysql的全文检索索引 优点:配置起来简单,改mysql配置即可 缺点:无法在django使用模型生成,查询语句也无法使用orm,只能用原生sql 基于 ...
- scrapy+jieba+whoosh实现搜索引擎
开始 学校小学期开了一门信息检索的课,结果碰到了大作业是实现垂直领域的搜索引擎,其中我们是要用网页展示的(当然了也可以用命令行,只是扣一点分). 自己在csdn和github上收集了很多资料,但是好多 ...
- 使用Whoosh构建自己的搜索引擎、whoosh和jieba实现中文全文检索
whoosh 是一个纯python实现的全文搜索引擎,它小巧轻便,安装简单,设计上参考了 Lucene ,性能上虽有欠缺,但贵在方便,无需复杂安装,对于构建小型网站的搜索引擎来说,是一个不错的选择.1 ...
- Diango博客--22.Django Haystack 全文检索与关键词高亮
文章目录 1. Django Haystack 简介 2. 安装 django-haystack和elasticsearch 2 3. 构建容器来运行 elasticsearch 服务 4. 配置 H ...
- Django开发个人博客网站——19、通过Django Haystack实现搜索功能(上)
该博客最开始采用的模板是并不包括搜索功能的,在主页只有主页.归档和分类三个部分.最后博主自己添加了搜索框,不过其实不太想让大家使用这个功能,因此将搜索框隐藏了,只有再点击搜索时,才会显现出来.但是这个 ...
- django+haystack+elasticsearch优化查询效率
django+haystack+elasticsearch优化查询效率 背景 安装环境 配置 1.在settings中的配置 2.在子应用下创建索引文件 3.指定索引模板文件 4.使用命令创建索引 索 ...
- django haystack一次使用总结
记一次django_haystack的坑 使用的是 whoosh 和jieba : pip install whoosh pip install jieba 首先在django,导入我们的haysta ...
- django+haystack+ElasticsearchSearch
django安装再次不介绍了 Elasticsearch参考该博主 先装docker,再一键安装docker pull elasticsearch:2.4.4 在此记录几个docker命令 docke ...
- Django博客搭建-新闻模块6-新闻搜索功能(Django+Haystack+elasticsearch)
Blog项目--新闻模块 文章目录 Blog项目--新闻模块 一.需求分析 二.搜索引擎原理 三.Elasticsearch 特点 四.使用docker安装elasticsearch 五.后端代码实现 ...
- python集合操作 读取_python – Django – 如何使用QuerySet过滤来获取对象的子集?...
根据 documentation: filter(**kwargs) Returns a new QuerySet containing objects that match the given lo ...
最新文章
- linux如何用vi编程,vi使用方法
- VS2015一新建项目就出现未将对象引用设置到对象的实例怎么办?
- python 模糊匹配 合并_Python Pandas模糊合并/匹配重复
- java 文件上传ssm_ssm框架下实现文件上传
- 模拟集成电路的经典教材
- 最详细的讲解 JS 原型与原型链
- VUE:兄弟组件间传参
- java中演示类_java中抽象类与接口的图文演示
- 构建之法首周阅读体会
- 第一次装TFS的曲折经历
- Zerotier Moon服务器配置
- is exists可以传数组查询吗_C++中数组类型的操作
- GsonFormat的使用 (转)
- 成人高考计算机专业怎么样,成人高考计算机专业就业前景怎么样?
- 均值滤波计算_基于FPGA的中值滤波算法实现
- Java视频特效处理(超全)/PC版美颜相机
- HaLoop—适用于迭代计算的Hadoop
- 使用Java打印字母菱形
- spss下载过程中无法解压的问题
- matlab 已实现极差波动,关于黄金期货论文范文写作 中国黄金期货价格SVR智能预测相关论文写作资料...
热门文章
- 【三维路径规划】基于matlab无人机三维路径规划【含Matlab源码 1262期】
- 【图像去噪】基于matlab GUI空域+频域滤波图像去噪【含Matlab源码 914期】
- 【图像分割】基于matlab关键像素点FLICM图像分割【含Matlab源码 406期】
- 【气动学】基于matlab内弹道【含Matlab源码 057期】
- SPSS 问卷与量表的区别及联系【SPSS 030期】
- 颜色 透明度 算法_通过问责制和透明度减少算法偏差
- 如何识别媒体偏见_面部识别,种族偏见和非洲执法
- 使用c语言函数的小结,C语言函数指针小结(1)
- 16进制发送 mqtt客户端调试工具_MQTT Simulate Device(MQTT客户端调试工具)下载 v1.0.7免费版-下载啦...
- kettle 内存设置_Kettle大数据量转换报错ora-04030: 在尝试分配484字节时进程内存不足...