使用haystack实现django全文检索搜索引擎功能

前言

django是python语言的一个web框架,功能强大。配合一些插件可为web网站很方便地添加搜索功能。

搜索引擎使用whoosh,是一个纯python实现的全文搜索引擎,小巧简单。

中文搜索需要进行中文分词,使用jieba

直接在django项目中使用whoosh需要关注一些基础细节问题,而通过haystack这一搜索框架,可以方便地在django中直接添加搜索功能,无需关注索引建立、搜索解析等细节问题。

haystack支持多种搜索引擎,不仅仅是whoosh,使用solr、elastic search等搜索,也可通过haystack,而且直接切换引擎即可,甚至无需修改搜索代码。

配置搜索

1.安装相关包

pip install django-haystack
pip install whoosh
pip install jieba

2.配置django的settings

修改settings.py文件,添加haystack应用:

INSTALLED_APPS = (...'haystack', #将haystack放在最后
)

在settings中追加haystack的相关配置:

HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine','PATH': os.path.join(BASE_DIR, 'whoosh_index'),}
}# 添加此项,当数据库改变时,会自动更新索引,非常方便
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

3.添加url

在整个项目的urls.py中,配置搜索功能的url路径:

urlpatterns = [...url(r'^search/', include('haystack.urls')),
]

4.在应用目录下,添加一个索引

在子应用的目录下,创建一个名为 search_indexes.py 的文件。

from haystack import indexes
# 修改此处,为你自己的model
from models import GoodsInfo# 修改此处,类名为模型类的名称+Index,比如模型类为GoodsInfo,则这里类名为GoodsInfoIndex
class GoodsInfoIndex(indexes.SearchIndex, indexes.Indexable):text = indexes.CharField(document=True, use_template=True)def get_model(self):# 修改此处,为你自己的modelreturn GoodsInfodef index_queryset(self, using=None):return self.get_model().objects.all()

说明:
1)修改上文中三处注释即可
2)此文件指定如何通过已有数据来建立索引。get_model处,直接将django中的model放过来,便可以直接完成索引啦,无需关注数据库读取、索引建立等细节。
3)text=indexes.CharField一句,指定了将模型类中的哪些字段建立索引,而use_template=True说明后续我们还要指定一个模板文件,告知具体是哪些字段

5.指定索引模板文件

在项目的“templates/search/indexes/应用名称/”下创建“模型类名称_text.txt”文件。

例如,上面的模型类名称为GoodsInfo,则创建goodsinfo_text.txt(全小写即可),此文件指定将模型中的哪些字段建立索引,写入如下内容:(只修改中文,不要改掉object)

{{ object.字段1 }}
{{ object.字段2 }}
{{ object.字段3 }}

6.指定搜索结果页面

在templates/search/下面,建立一个search.html页面。

<!DOCTYPE html>
<html>
<head><title></title>
</head>
<body>
{% if query %}<h3>搜索结果如下:</h3>{% for result in page.object_list %}<a href="/{{ result.object.id }}/">{{ result.object.gName }}</a><br/>{% empty %}<p>啥也没找到</p>{% endfor %}{% if page.has_previous or page.has_next %}<div>{% if page.has_previous %}<a href="?q={{ query }}&amp;page={{ page.previous_page_number }}">{% endif %}&laquo; 上一页{% if page.has_previous %}</a>{% endif %}|{% if page.has_next %}<a href="?q={{ query }}&amp;page={{ page.next_page_number }}">{% endif %}下一页 &raquo;{% if page.has_next %}</a>{% endif %}</div>{% endif %}
{% endif %}
</body>
</html>

7.使用jieba中文分词器

在haystack的安装文件夹下,路径如“/home/python/.virtualenvs/django_py2/lib/python2.7/site-packages/haystack/backends”,建立一个名为ChineseAnalyzer.py的文件,写入如下内容:

import jieba
from whoosh.analysis import Tokenizer, Tokenclass 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 = wt.boost = 1.0if 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 tdef ChineseAnalyzer():return ChineseTokenizer()

8.切换whoosh后端为中文分词

将上面backends目录中的whoosh_backend.py文件,复制一份,名为whoosh_cn_backend.py,然后打开此文件,进行替换:

# 顶部引入刚才添加的中文分词
from .ChineseAnalyzer import ChineseAnalyzer # 在整个py文件中,查找
analyzer=StemmingAnalyzer()
全部改为改为
analyzer=ChineseAnalyzer()
总共大概有两三处吧

9.生成索引

手动生成一次索引:

python manage.py rebuild_index

10.实现搜索入口

在网页中加入搜索框:

<form method='get' action="/search/" target="_blank"><input type="text" name="q"><input type="submit" value="查询">
</form>

丰富的自定义

上面只是快速完成一个基本的搜索引擎,haystack还有更多可自定义,来实现个性化的需求。

参考官方文档:http://django-haystack.readthedocs.io/en/master/

自定义搜索view

上面的配置中,搜索相关的请求被导入到haystack.urls中,如果想自定义搜索的view,实现更多功能,可以修改。

haystack.urls中内容其实很简单,

from django.conf.urls import url  
from haystack.views import SearchView  urlpatterns = [  url(r'^$', SearchView(), name='haystack_search'),  
]  

那么,我们写一个view,继承自SearchView,即可将搜索的url导入到自定义view中处理啦。

class MySearchView(SearchView):
# 重写相关的变量或方法
template = 'search_result.html'

查看SearchView的源码或文档,了解每个方法是做什么的,便可有针对性地进行修改。
比如,上面重写了template变量,修改了搜索结果页面模板的位置。

高亮

在搜索结果页的模板中,可以使用highlight标签(需要先load一下)

{% highlight <text_block> with <query> [css_class "class_name"] [html_tag "span"] [max_length 200] %}

text_block即为全部文字,query为高亮关键字,后面可选参数,可以定义高亮关键字的html标签、css类名,以及整个高亮部分的最长长度。

高亮部分的源码位于 haystack/templatetags/lighlight.py 和 haystack/utils/lighlighting.py文件中,可复制进行修改,实现自定义高亮功能。

ref.

  1. http://django-haystack.readthedocs.io/en/master/
  2. http://blog.csdn.net/ac_hell/article/details/52875927

转载于:https://www.cnblogs.com/aaanthony/p/7435244.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go_输入与输出

输出的几种方式&#xff1a; fmt.Print&#xff1a;属于标准输出流&#xff0c;一般使用它来进行屏幕输出&#xff0c;但它不能换行fmt.Printf&#xff1a;可以格式化输出&#xff0c;输出不换行fmt.Println&#xff1a;输出后换行fmt.Sprint&#xff1a;返回一个格式化的字符…

3、事件响应函数(一)

一、激活销毁 void OnEnable()//每次激活脚本时调用{print("OnEnable");}void OnDisable()//脚本取消激活状态调用{print("OnDisable");}void OnDestroy()//被销毁时调用{print("OnDestroy");} 二、鼠标事件 /// <summary>/// 代码添加到需…

人人都是产品经理?

产品经理顾名思义就是产品经理。那么只要搞懂产品是什么、经理又什么什么&#xff0c;就明白了产品经理是什么。 产品是什么&#xff1a; 产品是满足需求的载体&#xff0c;能被市场、人们使用和消费&#xff0c;并能满足人们某种需求&#xff08;创造价值&#xff09;的任何东…

搭建一个简单的FTP服务器

本文介绍通过win7自带的IIS来搭建一个只能实现基本功能的FTP服务器&#xff0c;第一次装好WIN7后我愣是没整出来&#xff0c;后来查了一下网上资料经过试验后搭建成功&#xff0c;其实原理和步骤与windows前期的版本差不多&#xff0c;主要是对新的操作系统还不是很熟悉。相信用…

3D文档(BRD、MRD、PRD)怎么写

3D文档&#xff1a; 一般来说&#xff0c;BRD作为战略方向的制定&#xff0c;是最早产出的文档&#xff0c;而MRD则是在战略方向的基础上对市场进行的分析&#xff0c;同时对后续工作的方向进行一些说明和指导&#xff0c;也可以说是通过对市场环境、竞品的分析&#xff0c;明确…

需求收集、分析、管理的方法

需求&#xff1a; 什么是需求 百度百科给的解释&#xff1a;指人们在某一特定的时期内在各种可能的价格下愿意并且能够购买某个具体商品的需要。所以要想明白需求&#xff0c;还要明白另外两个概念&#xff0c;需要和欲望&#xff0c;因为从需要到需求是一个由宏观到微观的过程…

Oracle中start with...connect by子句的用法

connect by 是结构化查询中用到的&#xff0c;其基本语法是&#xff1a;select … from tablenamestart with 条件1connect by 条件2where 条件3;例&#xff1a;select * from tablestart with org_id ‘HBHqfWGWPy’connect by prior org_id parent_id;简单说来是将一个树状…

用户访谈与问卷调查怎么做

用户访谈&#xff1a; 用提问交流的方式&#xff0c;了解用户体验的过程&#xff0c;访谈内容需要根据访谈目的来确定&#xff0c;通常包括产品的使用过程、使用感受、品牌印象等&#xff0c;属于定性研究。 访谈场景&#xff1a; 接听客服电话&#xff08;轮岗&#xff0c;客服…

【hdu2825】ac自动机 + 状压dp

传送门 题目大意&#xff1a; 给你一些密码片段字符串&#xff0c;让你求长度为n&#xff0c;且至少包含k个不同密码片段串的字符串的数量。 题解&#xff1a; 因为密码串不多&#xff0c;可以考虑状态压缩 设dp[i][j][sta]表示长为i的字符串匹配到j节点且状态为sta的数量。 其…

if函数 字体自动标红_发喜糖!REPT函数和图表订婚了~~

小伙伴们早上好呀&#xff01;今天为大家分享的是REPT函数的应用实例。案例1&#xff1a;基础用法左右&#xff1a;按照给定的次数重复显示文本用法&#xff1a;REPT(文本&#xff0c;重复次数)搭配&#xff1a;Wingdings字体家族的应用案例2&#xff1a;条形图⑴ 单元格D3输入…

用户体验五要素

用户体验&#xff1a; 用户在使用产品过程中建立起来的一种纯主观感受。 用户体验的重要性&#xff1a; 会失去客户&#xff1a;如果你没有良好的体验&#xff0c;用户不会使用你的产品&#xff0c;而且产品很难有二次机会接触用户。会增加获客成本&#xff1a;获客成本越来越高…

用鼠标旋转图像

这里涉及的到图像旋转后&#xff0c;方向的计算。我也不是很明白。先记录下来再说。 #_*_coding:utf-8 _*_import pygame from pygame.locals import * from sys import exit from gameobjects.vector2 import Vector2 from math import *background_image_filename./images/se…

trackingmore快递查询平台_国际快递物流信息追踪查询

以下是快递公司常用查询物流信息追踪平台1. 17TRACK查询网址&#xff1a;www.17track.net/zh-cn (强烈推荐&#xff0c;国际件都能查询)2. EMS查询网址&#xff1a;www.ems.com.cn 客服电话&#xff1a;11833. DHL网址查询&#xff1a;www.cn.dhl.com …

竞品分析该怎么做

竞品分析&#xff1a; 作用&#xff1a; 知己知彼&#xff0c;百战不殆。为自身产品设计提供功能、可用性、关键技术等方面的参考。提高自身产品的差异化程度。为新立项的产品、拍脑袋想出来的&#xff0c;降低风险。 如何选择竞品&#xff1a; 行业内领先的产品&#xff0c;通…

饿了么超时20分钟_饿了么回应“多等5分钟”,网友气炸了

广告记编辑整理(ID&#xff1a;adgroup)昨天一篇题为《外卖骑手&#xff0c;困在系统里》的文章刷屏文章指出外卖骑手是被平台系统算法与数据支配的“工具人”在系统的压迫下骑手们每天都在违反交规、与死神赛跑外卖员成了高危职业引发网友热议今天凌晨饿了么官方发布了一篇《你…

CCF历年试题总结

准备参加CCF考试&#xff0c;进行了一些试题的模拟&#xff0c;把做出的试题进行了一个汇总&#xff0c;持续更新中。 2017 201703-1 分蛋糕 转载于:https://www.cnblogs.com/shely-Wangfan/p/7452429.html

用户角色用户画像

用户角色&#xff1a; 用户角色 user personal&#xff0c;⽤户⻆⾊是⼀个集合体&#xff0c;不是指某个具体的⼈&#xff0c;是从用户群体中抽象出来的典型用户。 一般包含以下信息&#xff1a; 个人基本信息&#xff08;性别、年龄、性格、学历、婚姻、爱好、职业&#xff09…

java获取本周的开始时间和结束时间_创业板注册制开始时间/股票开户流程结束后,怎么炒股?...

股户流程刚走完&#xff0c;先别急着炒股&#xff0c;多研究股市行情。首选开户选好券商&#xff0c;没选好后患无穷&#xff0c;券商建议是富途、老虎&#xff0c;这两家美股港股都可以入&#xff0c;各有优势&#xff0c;富途的港股股票期权值得关注&#xff0c;老虎证券目前…

MarkDown 中使用 LaTeX 数学式

&#xfffc; 最近看了些机器学习的书籍, 想写点笔记记录下. 由于需要使用到很多的数学推导, 所以就看了下如何在 Markdown 中插入数学式&#xff0c;发现在 Markdown 中可以直接插入 LaTeX 数学式. 排版数学公式是 \(\TeX\) 系统设计的初衷, 在 \(\LaTeX\) 中占有特殊地位, 是…

信息架构、结构图、流程图

互联网信息架构&#xff1a; 信息架构的本质就是分类&#xff01;按照一定的规则&#xff0c;对产品的功能和内容进行组织&#xff0c;在功能确定的情况下&#xff0c;合理地设置和摆放&#xff0c;建立尽可能短的使用路径。目的就是为了更高效的满足用户的使用需求。如不进行信…