Django实现全文检索的方法(支持中文)
PS:我的检索是在文章模块下forum/article
第一步:先安装需要的包:
pipinstalldjango-haystack pipinstallwhoosh pipinstalljieba
第二步:配置需要的文件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_SIGNAL_PROCESSOR='haystack.signals.RealtimeSignalProcessor'#索引自动更新
第三步:配置url路径
在forum/forum/urls.py中包含search路径
url(r'^search/',include('haystack.urls')),
第四步:建立模型
forum/article/models.py
classArticle(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模块
fromarticle.modelsimportArticle fromhaystackimportindexes classArticleIndex(indexes.SearchIndex,indexes.Indexable): text=indexes.CharField(document=True,use_template=True) defget_model(self): returnArticle defindex_queryset(self,using=None): returnself.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:\python\Lib\site-packages\haystack\backends\whoosh_backend.py
)放到article下,并重命名为whoosh_cn_backend.py,例如blog/whoosh_cn_backend.py。修改如下:
导入
fromjieba.analyseimportChineseAnalyzer
找到
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(搜索页面)
结果展示页面(forum/article/templates/search/search.html)
{%extends'base.html'%} {%blocktitle%}搜索结果{%endblock%} {%blockcontent%}{%ifquery%}
搜索 搜索结果
{%forresultinpage.object_list%} {%empty%}作者:
{{result.object.title}} {{result.object.user.username}} {{result.object.content|safe|truncatechars_html:40}}
没有得到想要的结果哦.
{%endfor%} {%ifpage.has_previousorpage.has_next%}{%ifpage.has_previous%}{%endif%} {%else%} {#Showsomeexamplequeriestorun,maybequerysyntax,somethingelse?#} {%endif%}{%endif%}«上一页{%ifpage.has_previous%}{%endif%} | {%ifpage.has_next%} {%endif%}下一页»{%ifpage.has_next%}{%endif%}