欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django中使用haystack+whoosh實現(xiàn)搜索功能

 更新時間:2019年10月08日 08:26:01   作者:YifChan  
這篇文章主要介紹了Django之使用haystack+whoosh實現(xiàn)搜索功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

為了實現(xiàn)項目中的搜索功能,我們使用的是全文檢索框架haystack+搜索引擎whoosh+中文分詞包jieba

安裝和配置

安裝所需包

pip install django-haystack
pip install whoosh
pip install jieba

去settings文件注冊haystack應(yīng)用

INSTALLED_APPS = [
 'haystack', # 注冊全文檢索框架
]

在settings文件中配置全文檢索框架

# 全文檢索框架的配置
HAYSTACK_CONNECTIONS = {
 'default': {
  # 使用whoosh引擎
  'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
  # 索引文件路徑
  'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
 }
}

# 當(dāng)添加、修改、刪除數(shù)據(jù)時,自動生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

索引文件的生成

要生成索引文件,首先你要配置,對哪些內(nèi)容進行索引,比如商品名稱,簡介和詳情;為了配置對數(shù)據(jù)庫指定內(nèi)容進行索引,我們要做如下步驟:

配置search_indexes.py文件

因為在django中數(shù)據(jù)庫一般都是通過ORM生成的,首先我們在要在數(shù)據(jù)表對應(yīng)的應(yīng)用中創(chuàng)建一個 search_indexes.py 文件,例如,我現(xiàn)在要檢索商品對應(yīng)的表就是GoodsSKU表,而表是在goods應(yīng)用下的,所以我在goods應(yīng)用下新建 search_indexes.py 文件,截圖如下:

在 search_indexes.py 文件中加入以下內(nèi)容

# 定義索引類
from haystack import indexes
# 導(dǎo)入你的模型類
from goods.models import GoodsSKU
# 指定對于某個類的某些數(shù)據(jù)建立索引
# 索引類名格式:模型類名+Index
class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):
 # 索引字段 use_template=True指定根據(jù)表中的哪些字段建立索引文件的說明放在一個文件中
 text = indexes.CharField(document=True, use_template=True)
 def get_model(self):
  # 返回你的模型類
  return GoodsSKU
 # 建立索引的數(shù)據(jù)
 def index_queryset(self, using=None):
  return self.get_model().objects.all()

指定要檢索的內(nèi)容

在templates文件夾下面新建search文件夾,在search文件夾下面新建indexes文件夾,在indexes文件夾下面新建要檢索應(yīng)用名的文件夾比如goods文件夾,在goods文件夾下面新建 表名_text.txt,表名小寫,所以目前的目錄結(jié)構(gòu)是這樣的 templates/search/indexes/goods/goodssku_text.txt ,截圖如下:

在goodssku_text.txt 文件中指定你要根據(jù)表中的哪些字段建立索引數(shù)據(jù),現(xiàn)在我們要根據(jù)商品的名稱,簡介,詳情來建立索引,如下配置

# 指定根據(jù)表中的哪些字段建立索引數(shù)據(jù)
{{ object.name }} # 根據(jù)商品的名稱建立索引
{{ object.desc }} # 根據(jù)商品的簡介建立索引
{{ object.goods.detail }} # 根據(jù)商品的詳情建立索引

其中的objects可以理解為數(shù)據(jù)表對應(yīng)的商品對象。

生成索引文件

使用pycharm自帶的命令行terminal運行以下命令生成索引文件:

python manage.py rebuild_index

運行成功后,你可以在項目下看到類似如下索引文件

使用全文檢索

通過如上的配置,我們的數(shù)據(jù)索引已經(jīng)建立了,現(xiàn)在我們要在項目中使用全文檢索。

在需要使用檢索的地方進行 form 表單改造

<form action="/search" method="get">
 <input type="text" class="input_text fl" name="q" placeholder="搜索商品">
 <input type="submit" class="input_btn fr" name="" value="搜索">
</form>

如上所示,其中要注意的是:

發(fā)送方式必須使用get;

搜索的input框 name 必須是 q;

配置檢索對應(yīng)的url

在項目下的urls.py文件中添加如下url配置

urlpatterns = [
 url(r'^search/', include('haystack.urls')), # 全文檢索框架
]

檢索成功后生成的參數(shù)

當(dāng)haystack自動檢索成功后,會給我們返回三個參數(shù);

query參數(shù),表示你查詢的參數(shù);

page參數(shù),當(dāng)前頁的Page對象,是查詢到的對象的集合,可以通過for循環(huán)類獲取單個商品,通過 商品.objects.xxx 獲取商品對應(yīng)的字段;

paginator參數(shù),分頁paginator對象。

可以通過如下代碼測試參數(shù)

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
搜索的關(guān)鍵字:{{ query }}<br/>
當(dāng)前頁的Page對象:{{ page }}<br/>
<ul>
 {% for item in page %}
  <li>{{ item.object }}</li>
 {% endfor %}
</ul>
分頁paginator對象:{{ paginator }}<br/>
</body>
</html>

templates/indexes/search.html

注意,位置和文件名都是固定的,并且這只是測試文件,后面使用全文檢索時記得不能使用search.html,改成其他名字。

數(shù)據(jù)+search.html返回渲染后頁面

當(dāng)haystack全文檢索后會返回數(shù)據(jù),現(xiàn)在我們需要一個頁面來接收這些數(shù)據(jù),并且在頁面渲染后返回這個頁面給用戶觀看,渲染并返回頁面的工作haystack已經(jīng)幫我們做了,那么我們現(xiàn)在只需要準(zhǔn)備一個頁面容納數(shù)據(jù)即可。

在templates文件夾下的indexes文件夾下新建一個search.html,注意路徑和文件名是固定的,如下圖

利用檢索返回的參數(shù)在search.html中定義要渲染出的模板和樣式,我的頁面如下

<div class="breadcrumb">
 <a href="#">{{ query }}</a>
 <span>></span>
 <a href="#">搜索結(jié)果如下:</a>
</div>
<div class="main_wrap clearfix">
 <ul class="goods_type_list clearfix">
  {% for item in page %}
  <li>
   <a href="{% url 'goods:detail' item.object.id %}"><img src="{{ item.object.image.url }}"></a>
   <h4><a href="{% url 'goods:detail' item.object.id %}">{{ item.object.name }}</a></h4>
   <div class="operate">
    <span class="prize">¥{{ item.object.price }}</span>
    <span class="unit">{{ item.object.price}}/{{ item.object.unite }}</span>
    <a href="#" class="add_goods" title="加入購物車"></a>
   </div>
  </li>
  {% endfor %}
 </ul>
 <div class="pagenation">
   {% if page.has_previous %}
   <a href="/search?q={{ query }}&page={{ page.previous_page_number }}"><上一頁</a>
   {% endif %}
   {% for pindex in paginator.page_range %}
    {% if pindex == page.number %}
     <a href="/search?q={{ query }}&page={{ pindex }}" class="active">{{ pindex }}</a>
    {% else %}
     <a href="/search?q={{ query }}&page={{ pindex }}">{{ pindex }}</a>
    {% endif %}
   {% endfor %}
   {% if page.has_next %}
   <a href="/search?q={{ query }}&page={{ page.next_page_number }}">下一頁></a>
   {% endif %}
  </div>
</div>

search.html

至此,我們可以在頁面上搜索一下內(nèi)容,應(yīng)該是能成功的,但也有可能不會返回任何數(shù)據(jù)就算name就是你搜索的內(nèi)容,這是因為我們現(xiàn)在使用的主要還是為英語服務(wù)的分詞包,接下來我們要配置使用中文分詞包了。

使用中文分詞包jieba

在前面的配置中我們已經(jīng)安裝了jieba;

創(chuàng)建 ChineseAnalyzer.py 文件

進入虛擬環(huán)境下的 Lib\site-packages\haystack\backends 目錄下新建 ChineseAnalyzer.py 文件

目錄如下圖

在文件中添加如下內(nèi)容

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()

ChineseAnalyzer.py

編寫haystack可使用的 whoosh_cn_backend.py 文件

直接在 虛擬環(huán)境下的 Lib\site-packages\haystack\backends 目錄下復(fù)制一份 whoosh_backend.py 文件 并且重命名復(fù)制文件為 whoosh_cn_backend.py;

在 whoosh_cn_backend.py 中導(dǎo)入我們編寫的 ChineseAnalyzer 類

from .ChineseAnalyzer import ChineseAnalyzer

更改haystack使用的分詞包為 jieba 編寫的中文分詞類,大概在第160行左右

# schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=StemmingAnalyzer(), field_boost=field_class.boost, sortable=True)
schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=ChineseAnalyzer(), field_boost=field_class.boost, sortable=True)

配置whoosh引擎使用 whoosh_cn_backend.py

在settings文件中更改原來的配置如下

# 全文檢索框架的配置
HAYSTACK_CONNECTIONS = {
 'default': {
  # 使用whoosh引擎
  # 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
  'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
  # 索引文件路徑
  'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
 }
}
# 當(dāng)添加、修改、刪除數(shù)據(jù)時,自動生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

重新生成索引文件

python manage.py rebuild_index

至此,就可以放心的使用搜索功能了,如圖,搜索成功的顯示頁面

可以通過如下配置控制每個分頁顯示的搜索出來對象的數(shù)目

# 指定搜索結(jié)果每頁顯示的條數(shù)
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 1

總結(jié)

以上所述是小編給大家介紹的Django之使用haystack+whoosh實現(xiàn)搜索功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • 基于Python?OpenCV和?dlib實現(xiàn)眨眼檢測

    基于Python?OpenCV和?dlib實現(xiàn)眨眼檢測

    這篇文章主要介紹了基于Python?OPenCV及dlib實現(xiàn)檢測視頻流中的眨眼次數(shù)。文中的代碼對我們的學(xué)習(xí)和工作有一定價值,感興趣的同學(xué)可以參考一下
    2021-12-12
  • Python編程基礎(chǔ)之輸入與輸出

    Python編程基礎(chǔ)之輸入與輸出

    這篇文章主要為大家介紹了Python輸入與輸出,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Django --Xadmin 判斷登錄者身份實例

    Django --Xadmin 判斷登錄者身份實例

    這篇文章主要介紹了Django --Xadmin 判斷登錄者身份實例,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python學(xué)習(xí)之os包使用教程詳解

    Python學(xué)習(xí)之os包使用教程詳解

    本文將詳細介紹python的內(nèi)置包——OS?包。OS?包擁有著普遍的操作系統(tǒng)功能,擁有著各種各樣的函數(shù)來操作系統(tǒng)的驅(qū)動功能??靵砀S小編一起學(xué)習(xí)一下OS包的使用方法吧
    2022-03-03
  • Python3自帶工具2to3.py 轉(zhuǎn)換 Python2.x 代碼到Python3的操作

    Python3自帶工具2to3.py 轉(zhuǎn)換 Python2.x 代碼到Python3的操作

    Python3自帶工具2to3.py 轉(zhuǎn)換 Python2.x 代碼到Python3的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python如何基于smtplib發(fā)不同格式的郵件

    Python如何基于smtplib發(fā)不同格式的郵件

    這篇文章主要介紹了Python如何基于smtplib發(fā)不同格式的郵件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Python判斷列表是否已排序的各種方法及其性能分析

    Python判斷列表是否已排序的各種方法及其性能分析

    這篇文章主要介紹了Python判斷列表是否已排序的各種方法及其性能分析的相關(guān)資料,需要的朋友可以參考下
    2016-06-06
  • Python實現(xiàn)AES加密,解密的兩種方法

    Python實現(xiàn)AES加密,解密的兩種方法

    這篇文章主要介紹了Python實現(xiàn)AES加密,解密的兩種方法,幫助大家更好的使用python加解密文件,感興趣的朋友可以了解下
    2020-10-10
  • Python中多繼承與菱形繼承問題的解決方案與實踐

    Python中多繼承與菱形繼承問題的解決方案與實踐

    在Python這個靈活且功能強大的編程語言中,多繼承是一個既強大又復(fù)雜的概念,它允許一個類繼承自多個父類,從而能夠復(fù)用多個父類的屬性和方法,本文將深入解釋Python中的多繼承概念,詳細剖析菱形繼承問題,并探討Python是如何解決這一難題的,需要的朋友可以參考下
    2024-07-07
  • 詳解Python中contextlib上下文管理模塊的用法

    詳解Python中contextlib上下文管理模塊的用法

    Python中一些內(nèi)建對象有了上下文管理器的支持,于是可以使用with語句來實現(xiàn)自動的文件打開關(guān)閉以及線程操作等,這里我們就從根基上來詳解Python中contextlib上下文管理模塊的用法
    2016-06-06

最新評論