django 實現全文檢索

2021-09-26 09:33:29 字數 3956 閱讀 8870

全文檢索不同於特定欄位的模糊查詢,使用全文檢索的效率再高,並且能夠對於中文進行分詞處理。

安裝包:

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...