全文檢索不同於特定欄位的模糊查詢,使用全文檢索的效率再高,並且能夠對於中文進行分詞處理。
安裝包:
pip install django-haystack
pip install whoosh
pip install jieba
修改settings檔案[
'haystack'
,# 全文檢索框架
] 全文檢索框架的配置
haystack_connections =,}
# 當新增、修改、刪除資料時,自動生成索引
haystack_signal_processor =
'haystack.signals.realtimesignalprocessor'
# 設定每頁顯示的數目,預設為20,可以自己修改
haystack_search_results_per_page =
8
# 定義索引類
from haystack import indexes
from
.models import goods
# 索引類名格式:模型類名+index
class
goodsindex
(indexes.searchindex, indexes.indexable)
:"""
"""# 索引字段:use_template 指定根據表中的哪些字段 建立索引檔案
# 把說明放在乙個檔案中
text = indexes.charfield(document=
true
, use_template=
true
)# 建立檢索字段,model_attr模型屬性,如果需要多欄位的話,在這裡新增需要檢索的字段
goods_name = indexes.ngramfield(model_attr=
"goods_name"
)def
get_model
(self)
:return goods # 返回的模型類
defindex_queryset
(self, using=
none):
return self.get_model(
).objects.
all(
)
在templates下面建立如下資料夾 search/indexes/goods,在這下面建立goods_text.txt(goods是需要檢索的模型類的小寫)
注:名稱是固定的,不可隨意更改
在goods_test.txt裡面寫入需要檢索的字段
# 指定根據表中的哪些字段建立索引資料
}# 根據商品的名稱建立索引
進入到專案所在的目錄,建立索引檔案:python manage.py rebuild_index
html下搜尋框固定設定
action
="./search"
method
="get"
>
<--form的method必須為get--
>
type
="text"
placeholder
="搜尋品牌 店鋪..."
name
="q"
>
<--inpu的name必須為q--
>
type
="submit"
value
="搜尋"
>
form
>
配置專案下的urls
from django.urls import path, include
urlpatterns =
[ path(
'search/'
, include(
'haystack.urls'))
# 全文檢過框架
]
**搜尋出來的結果,haystack會把搜尋結果傳遞給templates/search目錄下的search.html,所以需要在templates的searc**件夾下建立search.html檔案。**傳遞的上下文包括:
query: 搜尋的關鍵字
page:當前頁的page物件
serchresult類的例項物件,物件的屬性是object
paginator:分頁paginator物件
# 設定每頁顯示的數目,預設為20,可以自己修改
haystack_search_results_per_page =
8
配置中文分詞器,這裡用到的模組為jieba,檔名為:tokenizer.py,把本檔案放在與search_indexes.py同目錄下,我這裡放在了goods資料夾下
from jieba import cut_for_search
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 = cut(value, cut_all=false) # (精確模式)使用結巴分詞庫進行分詞
seglist = cut_for_search(value)
# (搜尋引擎模式) 使用結巴分詞庫進行分詞
for w in seglist:
t.original = t.text = w
t.boost =
1.0if 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 # 通過生成器返回每個分詞的結果token
defchineseanalyzer()
:return chinesetokenizer(
)
# ctrl+f搜尋 「build_schema」函式
# 匯入中文分析器
from goods.tokenizer import chineseanalyzer
schema_fields[field_class.index_fieldname]
= text(stored=
true
, analyzer=chineseanalyzer(
), field_boost=field_class.boost, sortable=
true
)
全文檢索 Django
全文檢索不同於特定欄位的模糊查詢,使用全文檢索的效率更高,並且能夠對於中文進行分詞處理 haystack django的乙個包,可以方便地對model裡面的內容進行索引 搜尋,設計為支援whoosh,solr,xapian,elasticsearc四種全文檢索引擎後端,屬於一種全文檢索的框架 who...
Django全文檢索
最常見的全文檢索就是我們在資料庫進行的模糊查詢,但是模糊查詢是針對整體的內容的乙個動態匹配過程,在資料量較大的情況下匹配效率極低,常規專案中資料量一般都比較多並且內容繁雜,所以正常的專案搜尋功能中很少使用模糊查詢進行操作 python提供了各種全文檢索的模組,最常見的如haystack模組進行全文檢...
Django搜尋工具 全文檢索
pip install django haystack pip install whoosh pip install jieba haystack coding utf 8 haystack connections 當新增 修改 刪除資料時,自動生成索引 haystack signal proces...