商品搜索:
1.安装python包:
pip install django-haystack # 全文检索框架
pip install whoosh # 引擎
如果出现bug解决方案:
系统报错
distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse('setuptools_scm')
1
解决办法:
安装django-haystack之前,先安装setuptools
pip install setuptools-scm
1
再执行安装django-haystack的操作。
如果以上方法还会报错,可以安装certifi,解决问题
pip install certifi==2017.7.27.1
————————————————
版权声明:本文为CSDN博主「BrucePython」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/BrucePython/article/details/80063326
bug解决方案
2.settings.py配置:
-去django注册:haystack
# 全文检索框架的配置
HAYSTACK_CONNECTIONS = {
'default': {
#使用whoosh引擎
# 'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
#索引文件路径 存放索引目录
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
3.在templates下建立几个包,文件,templates/search(固定)/indexes(固定)/goods(应用名)/goodssku_text.txt(查询的类名小写)
# 指定哪些字段建立索引
{{ object.name}} # 根据商品名称建立索引
{{ object.desc}} # 简介建立索引
{{ object.goods.detail}} # 详情建立索引
4.在goods(应用名)下建立search_indexes.py,写入:
# 定义索引类
from haystack import indexes
# 导入模型类
from goods.models import GoodsSKU
# 指定对于某个类的某些数据建立索引
class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):
# text是索引字段
# 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() # 查询商品表里面所有数据
5.在search包下建立search.html(固定)
{#{{ query }} 搜索的关键字 #}
Page对象:{{ page }} 当前页的page对象,for循环page对象,获取到SearchResult实例对象,对象的属性object才是模型类对象
paginator : 分页paginator对象
6.路由: url(r'^search/', include('haystack.urls'))
7.更换中文搜索
中文词安装包:pip install jieba
找到环境路径:D:Virtualenvs iantianlibsite-packageshaystack
进入: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_cn_backend.py
查找analyzer=StemmingAnalyzer()
改为:analyzer=ChineseAnalyzer()
9. 执行命令:python manage.py rebuild_index
Django实现全文检索(支持中文)
___大鱼___
0.096
2018.05.12 10:45:02
字数 340
阅读 1,670
PS: 我的检索是在文章模块下 forum/article
第一步:先安装需要的包:
pip install django-haystack
pip install whoosh
pip install jieba
第二步: 配置需要的文件 settings.py
添加haystack应用模块
INSTALLED_APPS = (
...
'haystack',
...
)
在settings.py 末尾添加
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'article.whoosh_cn_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
},
}
# 指定每页显示的结果数量
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' # 索引自动更新
第三步: 配置url路径
在 forum/forum/urls.py中包含search路径
url(r'^search/', include('haystack.urls')),
第四步:建立模型
forum/article/models.py
class Article(models.Model):
'''
文章数据模型
'''
id = models.AutoField(primary_key=True,verbose_name='文章编号')
title = models.CharField(max_length=50,verbose_name='文章标题')
content = MDTextField()
publish_time = models.DateTimeField(auto_now_add=True,verbose_name='发表时间')
last_update_time = models.DateTimeField(auto_now=True,verbose_name='最后一次修改时间')
status = models.IntegerField(u'状态', default=1)
read_count = models.IntegerField(default=0,verbose_name='阅读次数')
comment_count = models.IntegerField(default=0,verbose_name='评论次数')
#关联用户
user = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='用户')
subject = models.ForeignKey(Subject, null=True, blank=True, on_delete=models.CASCADE,
verbose_name='属于哪一个专题')
第五步:设置为那个class建立索引
如果你想针对某个app例如mainapp做全文检索,则必须在mainapp的目录下面建立search_indexes.py文件,文件名不能修改
例:forum/article/search_indexes.py模块
from article.models import Article
from haystack import indexes
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.filter(status=1)
每个索引里面必须有且只能有一个字段为document=True
第六步: 确定我们需要的属性:
新建yourapp/templates/search/indexes/yourapp/article_text.txt来指明需要属性
例: article/templates/search/indexes/yourapp/article_text.txt
# 这里的对象可以自己写任意多个
{{ object.title }} # 文章标题
{{ object.user.username }} # 文章作者
{{ object.content }} # 文章内容
第七步: 把搜索引擎放入项目下
例: forum/article/whoosh_cn_backend.py
将文件whoosh_backend.py(例: 我的python路径E:pythonLibsite-packageshaystackackendswhoosh_backend.py
)放到article下,并重命名为whoosh_cn_backend.py,例如blog/whoosh_cn_backend.py。修改如下:
导入
from jieba.analyse import ChineseAnalyzer
找到
schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=StemmingAnalyzer(), field_boost=field_class.boost, sortable=True)
然后将其修改为
schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=ChineseAnalyzer(), field_boost=field_class.boost, sortable=True)
成功引入jieba分词
第八步: 前端页面配置
templates/base.html (搜索页面)
<form class="navbar-form navbar-left" action="{% url 'haystack_search' %}" method="get">
{% csrf_token %}
<div class="form-group">
<input type="text" class="form-control" name="q" placeholder="请输入搜索的内容" value=""/>
</div>
<input type="submit" value="搜索">
</form>
结果展示页面(forum/article/templates/search/search.html)
{% extends 'index.html' %}
{% block style %}
{% load static %}
<style>
span.highlighted{
color: red;
}
</style>
{% endblock %}
{% block jumbotron %}
{% endblock %}
{% block container %}
<div class="container" id="content" style="margin-top: 60px;">
<div class="search-body">
<form method="get" action="">
<table>
<tr>
<td>
<label for="id_q"></label>
</td>
<td>
<input class="form-control" id="id_q" name="q" type="search" value="{{ query }}" />
</td>
<td> </td>
<td>
<button class="btn btn-defaul" type="submit"><span class="glyphicon glyphicon-search">搜索</span></button>
</td>
</tr>
</table>
</form>
{% if query %}
<h3>搜索结果</h3>
<table class="table">
<tr>
{% load highlight %}
{% for result in page.object_list %}
<!--{% highlight result.object.content with query %} 代码高亮这样写 否则可以 {{ result.object.title }}这样写 -->
<td>
<p>
<a href="{% url 'article:detail' article_id=result.object.id %}">
{% highlight result.object.title with query %}</a>
</p> 作者: {% highlight result.object.author.username with query %}</a>
<p class="article_content">{% highlight result.object.content with query %}</p>
</td>
</tr>
{% empty %}
<p>没有得到想要的结果哦.</p>
{% endfor %}
</table>
{% 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 %}
{% else %}
{# Show some example queries to run, maybe query syntax, something else? #}
{% endif %}
</div>
</div>
{% endblock %}
{% block script %}
<script type="text/javascript">
</script>
{% endblock %}
第九步: 建立索引
python manage.py rebuild_index
建立成功会自行生成一个forum/whoosh_index的文件夹
第十步: 运行程序
python manage.py runserver
PS: 模板样式可以自行调整
代码高亮
在 {% for result in page.object_list %} 后加入即可
{% load highlight %}
{% for result in page.object_list %}
{% highlight result.object.title with query %}
<style>
span.highlighted{
color: red;
}
</style>