Django 引入全文檢索

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)

    1. 安裝全文檢索管理模塊 haystack格郁、全文搜索引擎模塊 whoosh和中文分詞 jieba
        >>> pip install haystack whoosh jieba
    
    1. Django 項(xiàng)目中添加 haystack 應(yīng)用
        INSTALLED_APPS = [
             ......
             # 這個(gè)模塊添加到所有子應(yīng)用模塊的前面
             'haystack',
        ]
    
    1. 項(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’
    
    1. 配置全文檢索路由
        #全文檢索搜索過程是由haystack模塊進(jìn)行操作的独悴,
        #所以搜索路由操作交給haystack進(jìn)行處理理张,修改路由配置文件如下:
    
        urlpatterns = [
              url(r’^search/$’, include(‘haystack.urls’)),
        ]
    
    1. 搜索管理模塊
        #在應(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()
    
    1. 搜索信息管理文件
        #在應(yīng)用目錄 templates/ 中創(chuàng)建 search/indexes/ 模型名稱_text.txt 文件绵患,編輯可搜索內(nèi)容
        {{object.content}}
        {{object.user}}
        ......
    
    1. 構(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 }}&amp;page={{ page.previous_page_number }}">
                                &laquo; 上一頁</a>
                      {% else %}
                            &laquo; 上一頁
                      {% endif %}
                      |
                      {% if page.has_next %} 
                            <a href="?q={{ query }}&amp;page={{ page.next_page_number }}">
                                 下一頁 &raquo;</a>
                      {% else %}
                            下一頁 &raquo;
                      {% endif %}
                  </div>
             {% endif %}
         {% endif %}
    
    1. 構(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()
      
      1. 初始化分詞索引
          #完成上述工作之后邪媳,中文分詞全文檢索已經(jīng)完成捐顷。
          #項(xiàng)目中支持對(duì)Article數(shù)據(jù)對(duì)象的中文分詞全文搜索功能了荡陷,接下來進(jìn)行索引數(shù)據(jù)的初始化
      
          >>> python manage.py rebuild_index
      
          # 輸入 y 確認(rèn),直到顯示 successfully 初始化成功迅涮。
      
      1. 搜索
          #在需要搜索功能的網(wǎng)頁中废赞,添加搜索表單
          <form action=’/search/’ target=’_blank’>
          <input type=’text’ name=’q’ placeholder=’請(qǐng)輸入關(guān)鍵詞’/>
          <input type=’submit’ value=’搜索’/>
          </form>
      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叮姑,隨后出現(xiàn)的幾起案子唉地,更是在濱河造成了極大的恐慌,老刑警劉巖传透,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耘沼,死亡現(xiàn)場離奇詭異,居然都是意外死亡朱盐,警方通過查閱死者的電腦和手機(jī)群嗤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來托享,“玉大人骚烧,你說我怎么就攤上這事∪蛭В” “怎么了赃绊?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長羡榴。 經(jīng)常有香客問我碧查,道長,這世上最難降的妖魔是什么校仑? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任忠售,我火速辦了婚禮,結(jié)果婚禮上迄沫,老公的妹妹穿的比我還像新娘稻扬。我一直安慰自己,他們只是感情好羊瘩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布泰佳。 她就那樣靜靜地躺著,像睡著了一般尘吗。 火紅的嫁衣襯著肌膚如雪逝她。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天睬捶,我揣著相機(jī)與錄音黔宛,去河邊找鬼。 笑死擒贸,一個(gè)胖子當(dāng)著我的面吹牛臀晃,可吹牛的內(nèi)容都是我干的觉渴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼积仗,長吁一口氣:“原來是場噩夢啊……” “哼疆拘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寂曹,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤哎迄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后隆圆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漱挚,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年渺氧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旨涝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侣背,死狀恐怖白华,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贩耐,我是刑警寧澤弧腥,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站潮太,受9級(jí)特大地震影響管搪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铡买,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一更鲁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奇钞,春花似錦澡为、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纠亚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筋夏,已是汗流浹背蒂胞。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留条篷,地道東北人骗随。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓蛤织,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸿染。 傳聞我的和親對(duì)象是個(gè)殘疾皇子指蚜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1.安裝模塊 全文檢索管理模塊haystack、全文搜索引擎模塊whoosh和中文分詞jiebapip insta...
    零_WYF閱讀 249評(píng)論 0 0
  • 全文檢索就是針對(duì)所有內(nèi)容進(jìn)行動(dòng)態(tài)匹配搜索的概念涨椒,針對(duì)特定的關(guān)鍵詞建立索引并精確匹配達(dá)到性能優(yōu)化的目的 最常見的全文...
    梅花九弄丶閱讀 1,534評(píng)論 0 1
  • 全文檢索概述 全文檢索就是針對(duì)所有內(nèi)容進(jìn)行動(dòng)態(tài)匹配搜索的概念摊鸡,針對(duì)特定的關(guān)鍵詞進(jìn)行建立索引并精確匹配達(dá)到性能優(yōu)化的...
    云Shen不知處閱讀 393評(píng)論 0 0
  • 感覺網(wǎng)絡(luò)上關(guān)于Django全文搜索的中文文章太少,并且講的也不是很到位蚕冬,就是簡單介紹了怎么配置免猾,并沒有說這樣配置有...
    tenlee閱讀 8,010評(píng)論 3 16
  • 全文鏈接 第一章 創(chuàng)建一個(gè)blog應(yīng)用第二章 使用高級(jí)特性來增強(qiáng)你的blog第三章 擴(kuò)展你的blog應(yīng)用第四章上 ...
    夜夜月閱讀 8,845評(píng)論 27 31