搜尋可以使用最原始的模糊匹配的like方式進行搜尋。當然這種搜尋方式對於一些小量的資料是非常合適的。但是隨著資料量越來越大。這時候我們就需要使用搜尋引擎了。搜尋引擎會將所有需要搜尋的資料使用演算法做乙個索引,以後搜尋的時候就只需要根據這個索引即可找到相應的資料。搜尋引擎做索引的過程會比較慢,甚至占用空間,但是一旦索引建立完成,那麼以後再搜尋的時候就會很快了。
這個外掛程式是專門給django提供搜尋功能的。django-haystack提供了乙個搜尋的介面,底層可以根據自己的需求更換搜尋引擎。他其實有點類似於django中的orm外掛程式,提供了乙個運算元據庫的介面,但是底層具體使用哪個資料庫是可以自己設定的。
django-haystack支援的搜尋引擎有solr、elasticsearch、whoosh、xapian等。whoosh是基於純python的搜尋引擎,檢索速度快,整合方便。
pip3 install django-haystack
pip3 install whoosh
1.在專案中安裝django-haystack,在settings.py[
2'django.contrib.admin',3
'django.contrib.auth',4
'django.contrib.contenttypes',5
'django.contrib.sessions',6
'django.contrib.sites',7
8# 新增
9'haystack',10
]2.設定搜尋引擎,在settings中
1 haystack_connections =
8}
3.建立索引類1
class
newsindex
(indexes.searchindex,indexes.indexable)
:2 text = indexes.charfield(document=
true
,use_template=
true)3
4def
get_model
(self):5
return news67
defindex_queryset
(self, using=
none):
8return self.get_model(
).objects.
all(
)
4.新增url對映
1 urlpatterns =
[2 path(
'',views.index,name=
'index'),
3# 新增search的url對映
4 path(
'search/'
,include(
'haystack.urls'))
,5 path(
'news/'
, include()),6]
5.新增模板在templates資料夾下建立以下結構的目錄:
1 templates
2 search
3 indexes
5 news(模型的名字)_text.txt
然後在news_text.txt中新增需要被索引的字段
1
# 根據標題和內容文字2}
3}
緊接著templates檔案下建立search.html模板檔案,haystack會自動在templates檔案下尋找這個模板檔案渲染,並且會給這個模板傳入page/paginator/query等引數,django內建的分頁與查詢的關鍵字。我們可以通過page.object_list獲取到查詢出來的資料。
="recommend-list"
>
="thumbnail-group"
>
"#">
"}" alt=
"">
<
/a>
<
/div>
="news-group"
>
="title"
>
"#">
}<
/a>
<
/p>
="desc"
>
}<
/p>
="more"
>
="category"
>
}<
/span>
="pub-time"
>
}<
/span>
="author"
>
}<
/span>
<
/p>
<
/div>
<
/li>
<
/ul>6.建立索引
1 python manage.py rebuild_index
如果不想每次資料操作後都要手動的建立索引,可以在settings中配置:
1
# 增刪改查後自動建立索引
2 haystack_signal_processor =
'haystack.signals.realtimesignalprocessor'7.使用jieba分詞替換whoosh預設的分詞
whoosh預設是採用正規表示式進行分詞的,這對於英文詞彙適用,但是中文支援的不好,這裡替換為jieba分詞,jieba分詞庫對中文卻支援的好。
安裝
1 pip3 install jieba
安裝完成後,拷貝d:\python\lib\sitepackages\haystack\backends\whoosh_backend.py其中的**,將他放在專案的其他包中,然後建立乙個名叫whoosh_cn_backend.py檔案,把剛剛複製的**貼上進去,然後再新增以下**:
1
import jieba
2from whoosh.analysis import tokenizer, token 34
class
chinesetokenizer
(tokenizer):5
def__call__
(self, value, positions=
false
, chars=
false
,6 keeporiginal=
false
, removestops=
true
,7 start_pos=
0, start_char=
0, mode='',
**kwargs)
:8 t = token(positions, chars, removestops=removestops, mode=mode,
9**kwargs)
10 seglist = jieba.cut(value, cut_all=
true)11
for w in seglist:
12 t.original = t.text = w
13 t.boost =
1.014
if positions:
15 t.pos = start_pos + value.find(w)
16if chars:
17 t.startchar = start_char + value.find(w)
18 t.endchar = start_char + value.find(w)
+len
(w)19
yield t
2021
defchineseanalyzer()
:22return chinesetokenizer(
)然後再將之前的**中的分析器analyzer=stemminganalyzer()替換為analyzer=chineseanalyzer()就行了。
Django haystack實現全文搜尋
搜尋可以使用最原始的like的方式進行搜尋。當然這種搜尋方式對於些小的資料是非常合適的。但是隨著資料越來越大。這時候我們就需要使用搜尋引擎了。搜尋引擎會將所有要搜尋的資料使用演算法做個素引,以後搜尋的時候就只需要根據這個索引腳找到相應的資料。搜尋引擎做索引的過程會比較慢,但是一旦索引建立完成,那麼以...
django haystack實現全文檢索
haystack配置使用 前後端分離 索引檔案生成 替換成jieba分詞 索引檔案使用 1.haystack是django的開源搜尋框架,該框架支援solr,elasticsearch,whoosh,xapian 搜尋引擎,不用更 改 直接切換引擎,減少 量。2.搜尋引擎使用whoosh,這是乙個由...
Django haystack實現全文搜尋
原文 project project settings.py blog models.py 此models.py的內容假設如下 from django.db import models from django.contrib.auth.models import user class note mo...