1. 全文檢索
- 什么是全文檢索
全文檢索就是針對(duì)所有內(nèi)容進(jìn)行動(dòng)態(tài)匹配搜索的概念汹桦,針對(duì)特定的關(guān)鍵詞進(jìn)行建立索引并精確匹配達(dá)到性能優(yōu)化的目的您宪。 - 為什么引入全文檢索
最常見的全文檢索就是我們?cè)跀?shù)據(jù)庫中進(jìn)行的模糊查詢馍管,但是模糊查詢是針對(duì)整體內(nèi)容的一個(gè)動(dòng)態(tài)匹配過程去团,在數(shù)據(jù)量較大的情況下匹配效率極低寞秃,常規(guī)項(xiàng)目中數(shù)據(jù)量一般都比較多并且內(nèi)容繁雜瑰枫,所以正常的項(xiàng)目搜索功能中很少會(huì)使用模糊查詢進(jìn)行操作踱葛。
PS:如果你開發(fā)的項(xiàng)目用戶量較少并且項(xiàng)目數(shù)據(jù)較少的情況下,模糊查詢是你值得操作的選項(xiàng)光坝,畢竟開發(fā)成本較低尸诽。 - Python 一般用什么全文檢索
Python提供了各種全文檢索的模塊進(jìn)行,最常見的如haystack模塊進(jìn)行全文檢索整體管理操作盯另,后臺(tái)使用諸如whoosh性含、solr、Xapain鸳惯、Elasticsearc全文搜索引擎進(jìn)行操作商蕴,其中whoosh是純python開發(fā)的全文搜索引擎,可以方便穩(wěn)定的進(jìn)行數(shù)據(jù)的檢索操作功能芝发,并在實(shí)際操作過程中結(jié)合jieba中文分詞模塊對(duì)中文進(jìn)行分詞操作绪商,達(dá)到最優(yōu)的操作成本,是目前項(xiàng)目中較為流行的一種全文檢索方式辅鲸。
2.安裝全文檢索
官方文檔(http://django-haystack.readthedocs.io/en/v2.4.1/tutorial.html)
-
- 安裝全文檢索管理模塊 haystack格郁、全文搜索引擎模塊 whoosh和中文分詞 jieba
>>> pip install haystack whoosh jieba
-
- Django 項(xiàng)目中添加 haystack 應(yīng)用
INSTALLED_APPS = [ ...... # 這個(gè)模塊添加到所有子應(yīng)用模塊的前面 'haystack', ]
-
- 項(xiàng)目中添加搜索引擎配置
#修改Django項(xiàng)目配置文件,添加搜索引擎配置選項(xiàng)[項(xiàng)目settings.py配置文件] # 搜索引擎配置 HAYSTACK_CONNECTIONS = { ‘default’: { ‘ENGINE’: ‘haystack.backends.whoosh_cn_backend.WhooshEngine’, ‘PATH’: os.path.join(BASE_DIR, ‘whoosh_index’), } } # 自動(dòng)更新加載中文分詞索引支持 HAYSTACK_SIGNAL_PROCESSOR = ‘haystack.signals.RealtimeSignalProcessor’
-
- 配置全文檢索路由
#全文檢索搜索過程是由haystack模塊進(jìn)行操作的独悴, #所以搜索路由操作交給haystack進(jìn)行處理理张,修改路由配置文件如下: urlpatterns = [ url(r’^search/$’, include(‘haystack.urls’)), ]
-
- 搜索管理模塊
#在應(yīng)用模塊下創(chuàng)建search_indexes.py模塊文件,管理搜索的數(shù)據(jù)模型 from haystack improt indexes from . import models #文章類的搜索類 class ArticleIndex(indexes.SearchIndex, indexes.Indexable): #內(nèi)容搜索 text = indexes.CharField(document=True, use_template=True) #根據(jù)作者搜索 author = indexes.CharField(model_attr='user') #時(shí)間搜索 pub_date = indexes.DateTimeField(model_attr='pub_date') def get_mode(self): return modles.Article # 返回要搜索的數(shù)據(jù)模型 def index_queryset(self, using=None): return self.get_mode().objects.all()
-
- 搜索信息管理文件
#在應(yīng)用目錄 templates/ 中創(chuàng)建 search/indexes/ 模型名稱_text.txt 文件绵患,編輯可搜索內(nèi)容 {{object.content}} {{object.user}} ......
-
- 構(gòu)建搜索結(jié)果展示
{% if query %} <h3>搜索結(jié)果如下:</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 }}&page={{ page.previous_page_number }}"> « 上一頁</a> {% else %} « 上一頁 {% endif %} | {% if page.has_next %} <a href="?q={{ query }}&page={{ page.next_page_number }}"> 下一頁 »</a> {% else %} 下一頁 » {% endif %} </div> {% endif %} {% endif %}
-
- 構(gòu)建中文分詞分析模塊【改寫haystack的分詞模塊】
whoosh作為一個(gè)全文搜索引擎模塊,分詞功能和檢索功能已經(jīng)非常強(qiáng)大悟耘,但是針對(duì)中文的處理還是比較欠缺落蝙,所以通過Jieba模塊重寫分詞操作,支持whoose對(duì)中文的強(qiáng)大操作暂幼。
-
創(chuàng)建一個(gè)新的中文分詞模塊 ChineseAnalyzer.py 文件
打開安裝的whoosh模塊目錄筏勒,在python安裝目錄的site_packages/目錄下找到對(duì)應(yīng)的目錄文件haystack/backends/,創(chuàng)建文件旺嬉。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()
-
創(chuàng)建 whoosh_cn_backend.py 文件
找到 whoosh 中文分詞模塊 site_packages/haystack/backends/ 目錄中的分詞后臺(tái)處理文件 whoosh_backend.py 管行,復(fù)制為 whoosh_cn_backend.py ,編輯修改內(nèi)部內(nèi)容#導(dǎo)入創(chuàng)建的jieba 中文分詞模塊 from .ChineseAnalyzer import ChineseAnalyzer ...... # 搜索查詢賦值參數(shù) analyzer=StemmingAnalyzer() # 將分析器對(duì)象更改為我們自定義的中文分詞分析器 analyzer=ChineseAnalyzer()
-
- 初始化分詞索引
#完成上述工作之后邪媳,中文分詞全文檢索已經(jīng)完成捐顷。 #項(xiàng)目中支持對(duì)Article數(shù)據(jù)對(duì)象的中文分詞全文搜索功能了荡陷,接下來進(jìn)行索引數(shù)據(jù)的初始化 >>> python manage.py rebuild_index # 輸入 y 確認(rèn),直到顯示 successfully 初始化成功迅涮。
-
- 搜索
#在需要搜索功能的網(wǎng)頁中废赞,添加搜索表單 <form action=’/search/’ target=’_blank’> <input type=’text’ name=’q’ placeholder=’請(qǐng)輸入關(guān)鍵詞’/> <input type=’submit’ value=’搜索’/> </form>
- 構(gòu)建中文分詞分析模塊【改寫haystack的分詞模塊】