day-91项目上线与Haystack
项目上线参考day-90
Haystack
什么是Haystack:
Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),
该框架支持**Solr**,**Elasticsearch**,**Whoosh**, ***Xapian*搜索引擎它是一个可插拔的后端(很像Django的数据库)
whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用
jieba:一款免费的中文分词包
1.安装
pip install django-haystack
pip install whoosh
pip install jieba
2.配置(settings.py)
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', # 添加 'haystack', ] import os HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', 'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'), }, }
3.为模型表创建索引
a.在应用(app)目录下面建立`search_indexes.py`文件,文件名不能修改 ,里面内容如下 from haystack import indexes from app01.models import Article #导入模型表 class ArticleIndex(indexes.SearchIndex, indexes.Indexable): #类名必须为需要检索的 模型类名+Index(如:ArticleIndex) text = indexes.CharField(document=True, use_template=True) #创建一个text字段 def get_model(self): return Article def index_queryset(self, using=None): return self.get_model().objects.all() b.创建目录“templates/search/indexes/应用名称/,然后创建“模型类名称+_text.txt”文件,里面填写需要索引的字段 {{ object.title }} {{ object.desc }} {{ object.content }}
4.路由相关设置
a.添加路由(显示搜索结果路由) (r'^search/', include('haystack.urls')), b.创建搜索模板(在search文件夹下创建一个search.html) <!DOCTYPE html> <html> <head> <title></title> <style> span.highlighted { #搜索关键字颜色 color: red; } </style> </head> <body> {% load highlight %} {% if query %} <h3>搜索结果如下:</h3> {% for result in page.object_list %} {# <a href="/{{ result.object.id }}/">{{ result.object.title }}</a><br/>#} #显示搜索到的模型表的字段内容 <a href="/{{ result.object.id }}/">{% highlight result.object.title with query max_length 2%}</a><br/> #max_length 2%:显示多少内容 <p>{{ result.object.content|safe }}</p> <p>{% highlight result.content with query %}</p> #显示搜索关键字颜色 {% empty %} <p>啥也没找到</p> {% endfor %} {% 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 %} {% endif %} </body> </html> c.重建索引 运行./manage.py rebuild_index,把模型表中的数据同步到whoosh(搜索引擎,相当于数据库)
5.使用jieba分词(修改haystack源代码)
在haystack的安装文件夹下,路径如“D:\python3\Lib\site-packages\haystack\backends”
a.建立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() b.复制whoosh_backend.py文件,改名为whoosh_cn_backend.py 注意:复制出来的文件名,末尾会有一个空格,记得要删除这个空格 c.在复制的文件中导入:from .ChineseAnalyzer import ChineseAnalyzer 查找:analyzer=StemmingAnalyzer() 改为:analyzer=ChineseAnalyzer()
6.在自己的HTML中创建搜索栏
<form method='get' action="/search/" target="_blank"> <input type="text" name="q"> <input type="submit" value="查询"> </form>