写在前面

电商网站,免不了用户搜索商品,根据一般的思路是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实现全文检索相关推荐

  1. Django+haystack+jieba进行全文检索

    最近,在做一个全文检索的功能,找了两个方案: mysql的全文检索索引 优点:配置起来简单,改mysql配置即可 缺点:无法在django使用模型生成,查询语句也无法使用orm,只能用原生sql 基于 ...

  2. scrapy+jieba+whoosh实现搜索引擎

    开始 学校小学期开了一门信息检索的课,结果碰到了大作业是实现垂直领域的搜索引擎,其中我们是要用网页展示的(当然了也可以用命令行,只是扣一点分). 自己在csdn和github上收集了很多资料,但是好多 ...

  3. 使用Whoosh构建自己的搜索引擎、whoosh和jieba实现中文全文检索

    whoosh 是一个纯python实现的全文搜索引擎,它小巧轻便,安装简单,设计上参考了 Lucene ,性能上虽有欠缺,但贵在方便,无需复杂安装,对于构建小型网站的搜索引擎来说,是一个不错的选择.1 ...

  4. Diango博客--22.Django Haystack 全文检索与关键词高亮

    文章目录 1. Django Haystack 简介 2. 安装 django-haystack和elasticsearch 2 3. 构建容器来运行 elasticsearch 服务 4. 配置 H ...

  5. Django开发个人博客网站——19、通过Django Haystack实现搜索功能(上)

    该博客最开始采用的模板是并不包括搜索功能的,在主页只有主页.归档和分类三个部分.最后博主自己添加了搜索框,不过其实不太想让大家使用这个功能,因此将搜索框隐藏了,只有再点击搜索时,才会显现出来.但是这个 ...

  6. django+haystack+elasticsearch优化查询效率

    django+haystack+elasticsearch优化查询效率 背景 安装环境 配置 1.在settings中的配置 2.在子应用下创建索引文件 3.指定索引模板文件 4.使用命令创建索引 索 ...

  7. django haystack一次使用总结

    记一次django_haystack的坑 使用的是 whoosh 和jieba : pip install whoosh pip install jieba 首先在django,导入我们的haysta ...

  8. django+haystack+ElasticsearchSearch

    django安装再次不介绍了 Elasticsearch参考该博主 先装docker,再一键安装docker pull elasticsearch:2.4.4 在此记录几个docker命令 docke ...

  9. Django博客搭建-新闻模块6-新闻搜索功能(Django+Haystack+elasticsearch)

    Blog项目--新闻模块 文章目录 Blog项目--新闻模块 一.需求分析 二.搜索引擎原理 三.Elasticsearch 特点 四.使用docker安装elasticsearch 五.后端代码实现 ...

  10. python集合操作 读取_python – Django – 如何使用QuerySet过滤来获取对象的子集?...

    根据 documentation: filter(**kwargs) Returns a new QuerySet containing objects that match the given lo ...

最新文章

  1. linux如何用vi编程,vi使用方法
  2. VS2015一新建项目就出现未将对象引用设置到对象的实例怎么办?
  3. python 模糊匹配 合并_Python Pandas模糊合并/匹配重复
  4. java 文件上传ssm_ssm框架下实现文件上传
  5. 模拟集成电路的经典教材
  6. 最详细的讲解 JS 原型与原型链
  7. VUE:兄弟组件间传参
  8. java中演示类_java中抽象类与接口的图文演示
  9. 构建之法首周阅读体会
  10. 第一次装TFS的曲折经历
  11. Zerotier Moon服务器配置
  12. is exists可以传数组查询吗_C++中数组类型的操作
  13. GsonFormat的使用 (转)
  14. 成人高考计算机专业怎么样,成人高考计算机专业就业前景怎么样?
  15. 均值滤波计算_基于FPGA的中值滤波算法实现
  16. Java视频特效处理(超全)/PC版美颜相机
  17. HaLoop—适用于迭代计算的Hadoop
  18. 使用Java打印字母菱形
  19. spss下载过程中无法解压的问题
  20. matlab 已实现极差波动,关于黄金期货论文范文写作 中国黄金期货价格SVR智能预测相关论文写作资料...

热门文章

  1. 【三维路径规划】基于matlab无人机三维路径规划【含Matlab源码 1262期】
  2. 【图像去噪】基于matlab GUI空域+频域滤波图像去噪【含Matlab源码 914期】
  3. 【图像分割】基于matlab关键像素点FLICM图像分割【含Matlab源码 406期】
  4. 【气动学】基于matlab内弹道【含Matlab源码 057期】
  5. SPSS 问卷与量表的区别及联系【SPSS 030期】
  6. 颜色 透明度 算法_通过问责制和透明度减少算法偏差
  7. 如何识别媒体偏见_面部识别,种族偏见和非洲执法
  8. 使用c语言函数的小结,C语言函数指针小结(1)
  9. 16进制发送 mqtt客户端调试工具_MQTT Simulate Device(MQTT客户端调试工具)下载 v1.0.7免费版-下载啦...
  10. kettle 内存设置_Kettle大数据量转换报错ora-04030: 在尝试分配484字节时进程内存不足...