django 使用全局搜索功能的实例详解
安装需要的包
1第一步:
全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理。
haystack:全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎
whoosh:纯Python编写的全文搜索引擎对于小型的站点,whoosh已经足够使用
jieba:一款免费的中文分词包
1)在虚拟环境中依次安装需要的包。
pipinstalldjango-haystack pipinstallwhoosh pipinstalljieba
2注册app
INSTALLED_APPS=( ... 'haystack', )
创建的models
classGoodInfo(models.Model): message=models.CharField(max_length=100) content=models.TextField() def__str__(self): returnself.message
3在settings中配置搜索引擎
#全文搜索引擎的配置 HAYSTACK_CONNECTIONS={ 'default':{ #使用whoosh引擎 'ENGINE':'haystack.backend.whoosh_cn_backend.WhooshEngine', #索引文件路径 'PATH':os.path.join(BASE_DIR,'whoosh_index'), } } #当添加、修改、删除数据时,自动生成索引 HAYSTACK_SIGNAL_PROCESSOR='haystack.signals.RealtimeSignalProcessor'
4在项目的urls.py中添加搜索的配置。
url(r'^search/',include('haystack.urls')),
5在创建的app目录下创建search_indexes.py编写一下程序
fromhaystackimportindexes from.modelsimportGoodInfo #对指定的某个类的某些数据建立索引 classGoodInfoIndex(indexes.SearchIndex,indexes.Indexable): text=indexes.CharField(document=True,use_template=True) defget_model(self): returnGoodInfo defindex_queryset(self,using=None): returnself.get_model().objects.all()
6在templates目录下创建"search/indexes/app06/"目录。(app06为自己创建的app的名称)
在文件夹中创建"goodinfo_text.txt"文件。(goodinfo为自己创建的数据库的名称)
#指定索引的属性 {{object.content}}(content为自己创建的表的一个字段把这个字段指定为索引字段)
7找到虚拟环境django下安装的haystack目录。
/home/python/.virtualenvs/django/lib/python2.7/site-packages/haystack/backends/
在上面的目录中创建ChineseAnalyzer.py文件。
importjieba fromwhoosh.analysisimportTokenizer,Token classChineseTokenizer(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) forwinseglist: t.original=t.text=w t.boost=1.0 ifpositions: t.pos=start_pos+value.find(w) ifchars: t.startchar=start_char+value.find(w) t.endchar=start_char+value.find(w)+len(w) yieldt defChineseAnalyzer(): returnChineseTokenizer()
8)复制whoosh_backend.py文件,改为如下名称:
注意:复制出来的文件名,末尾会有一个空格,记得要删除这个空格。
whoosh_cn_backend.py
9)打开复制出来的新文件,引入中文分析类,内部采用jieba分词。
from.ChineseAnalyzerimportChineseAnalyzer
10)更改词语分析类。
查找
analyzer=StemmingAnalyzer()
改为
analyzer=ChineseAnalyzer()
11)初始化索引数据。
pythonmanage.pyrebuild_index
按照提示输入y后生成索引在主目录下会生成一个whoosh_index文件夹其中放置三个索引文件
配置好后就该开始使用了
按照配置,在admin管理中添加数据后,会自动为数据创建索引,可以直接进行搜索,可以先创建一些测试数据。
1)在app06/views.py中定义视图query。
defquery(request): returnrender(request,'booktest/query.html')
2)在app06/urls.py中配置。
url(r'^query/',views.query),
3)在templates/app06/目录中创建模板query.html。
参数q表示搜索内容,传递到模板中的数据为query。
全文检索 (提交的路径就是在urls中配置的) #(这里注意input的name属性必须是q不能改变)
4)自定义搜索结果模板:在templates/search/目录下创建search.html。
搜索结果进行分页,视图向模板中传递的上下文如下:
(这个上下文是搜素引擎自动给返回的不需要我们自己去写视图函数来进行返回直接进行使用就可以)
query:搜索关键字
page:当前页的page对象
paginator:分页paginator对象
视图接收的参数如下:
参数q表示搜索内容,传递到模板中的数据为query
参数page表示当前页码
全文检索--结果页 搜索 {{query}} 结果如下:
-
{%foriteminpage%}(注意这里面的对象的获取方式)
- {{item.object.id}}--{{item.object.content|safe}} {%empty%}
- 啥也没找到 {%endfor%}
{%forpindexinpage.paginator.page_range%}(后面的是返回的是全部的页码) {%ifpindex==page.number%}(page.number)返回的是当前的页码 {{pindex}} {%else%}(按照页码进行翻页的时候也要注意这样的翻页方式)
5)运行服务器,在浏览器中输入如下地址:
http://127.0.0.1:8000/query/
以上这篇django使用全局搜索功能的实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。