第15次:商品搜索

實現用戶在頁面可自由搜索某個商品的功能。

第1步:準備搜索功能用到的庫

pip install whoosh
pip install jieba
pip install django-haystack
  • whoosh是搜索引擎,對英文支持較好,但對中文效果不佳。
  • jieba為中文分詞庫,彌補whoosh的缺陷。
  • django-haystack為在django項目中使用搜索引擎的工具應用,通過它可以在不修改代碼的情況下使用不同的搜索引擎。

第2步:在settings.py中添加haystack應用

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','areas','carts','contents','goods','users','orders','payment','verifications','haystack'
]

第3步:在settings.py中新境搜索引擎whoosh的配置項

HAYSTACK_CONNECTIONS = {'default': {# 引擎使用whoosh'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',# 索引文件路徑'PATH': os.path.join(BASE_DIR, 'whoosh_index')}
}
# 添加、修改、刪除數據時,自動生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

第4步:將Whoosh自帶的分詞組件替換為jieba

在虛擬環境下(.venv\Lib\site-packages\haystack)創建ChineseAnalyzer.py

import jiebafrom whoosh.analysis import Tokenizer, Tokenclass ChineseTokenizer(Tokenizer):"""在 Whoosh 搜索引擎中, Token 對象是分詞過程中的核心數據結構,主要作用包括:1. 存儲分詞信息 :- text : 分詞后的實際文本內容- original : 原始分詞文本(可能與處理后的不同)- boost : 權重值,影響搜索結果排序2. 記錄位置信息 :- pos : 詞在文本中的位置序號- startchar / endchar : 字符級別的起始和結束位置3. 控制索引行為 :- removestops : 是否移除停用詞- mode : 控制索引模式(如存儲位置信息等)"""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 = wt.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 tdef ChineseAnalyzer():return ChineseTokenizer()

復制/haystack/backends下的whoosh_backend.py文件,將副本更名為whoosh_cn_backend.py

打開whoosh_cn_backend.py,引入中文分析器文件ChineseAnalyzer.py

analyzer=field_class.analyzer or StemmingAnalyzer(),替換為analyzer = ChineseAnalyzer(),

在goods應用下創建索引類search_indexes.py,代碼如下

from haystack import indexesfrom .models import SKUclass SKUIndex(indexes.SearchIndex, indexes.Indexable):"""索引數據模型類"""# 接收索引字段:使用文檔定義索引字段,并且使用模板語法渲染# document=True表示該字段是主要進行關鍵字查詢的字段,use_template=True表明后續要通過一個數據模板指明需要檢索的字段text = indexes.CharField(document=True, use_template=True)def get_model(self):"""返回建立索引的模型類"""return SKUdef index_queryset(self, using=None):"""返回要建立索引的數據查詢集"""return self.get_model().objects.filter(is_launched=True)

在templates/search/indexes/目錄下創建goods目錄,在其中創建sku_text.txt,在其中指定索引的屬性。

{{object.id}}
{{object.name}}
{{object.caption}}

執行下面命令,手動生成初始索引

python .\manage.py rebuild_indexAre you sure you wish to continue? [y/N] y

在這里插入圖片描述

在項目urls.py中增加haystack路由配置項

path('search/', include('haystack.urls')),

在templates/search/目錄下新增搜索結果模板search.html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><title>小魚商城-商品搜索</title><link rel="stylesheet" type="text/css" href="{{ static('css/jquery.pagination.css') }}"><link rel="stylesheet" type="text/css" href="{{ static('css/reset.css') }}"><link rel="stylesheet" type="text/css" href="{{ static('css/main.css') }}"><script type="text/javascript" src="{{ static('js/jquery-1.12.4.min.js') }}"></script><script type="text/javascript" src="{{ static('js/vue-2.5.16.js') }}"></script><script type="text/javascript" src="{{ static('js/axios-0.18.0.min.js') }}"></script>
</head>
<body>
<div id="app"><div class="header_con"><div class="header" v-cloak><div class="welcome fl">歡迎來到小魚商城!</div><div class="fr"><div v-if="username" class="login_btn fl">歡迎您:<em>[[ username ]]</em><span>|</span><a href="{{ url('users:logout') }}">退出</a></div><div v-else class="login_btn fl"><a href="{{ url('users:login') }}">登錄</a><span>|</span><a href="{{ url('users:register') }}">注冊</a></div><div class="user_link fl"><span>|</span><a href="{{ url('users:info') }}">用戶中心</a><span>|</span>{#                    <a href="{{ url('carts:info') }}">我的購物車</a>#}<span>|</span>{#                    <a href="{{ url('users:myorderinfo',args=(1,)) }}">我的訂單</a>#}</div></div></div></div><div class="search_bar clearfix"><a href="{{ url('contents:index') }}" class="logo fl"><img src="{{ static('images/logo.png') }}"></a><div class="search_wrap fl"><form method="get" action="/search/" class="search_con"><input type="text" class="input_text fl" name="q" placeholder="搜索商品"><input type="submit" class="input_btn fr" name="" value="搜索"></form><ul class="search_suggest fl"><li><a href="#">索尼微單</a></li><li><a href="#">優惠15元</a></li><li><a href="#">美妝個護</a></li><li><a href="#">買2免1</a></li></ul></div></div><div class="main_wrap clearfix"><div class="clearfix"><ul class="goods_type_list clearfix">{% for result in page %}<li><a href="detail.html"><img src="/static/images/goods/{{ result.object.default_image.url }}.jpg"></a><h4><a href="detail.html">{{ result.object.name }}</a></h4><div class="operate"><span class="price">¥{{ result.object.price }}</span><span>{{ result.object.comments }}評價</span><!--                        <span class="unit">{{ result.object.sales }}臺</span>--><a href="#" class="add_goods" title="加入購物車"></a></div></li>{% else %}<p>沒有找到您要查詢的商品。</p>{% endfor %}</ul><div class="pagenation"><div id="pagination" class="page"></div></div></div></div><div class="footer"><div class="foot_link"><a href="#">關于我們</a><span>|</span><a href="#">聯系我們</a><span>|</span><a href="#">招聘人才</a><span>|</span><a href="#">友情鏈接</a></div><p>CopyRight ? 2024 北京小魚商業股份有限公司 All Rights Reserved</p><p>電話:010-****888 京ICP備*******8號</p></div>
</div>
<script type="text/javascript" src="{{ static('js/common.js') }}"></script>
<script type="text/javascript" src="{{ static('js/search.js') }}"></script>
<script type="text/javascript" src="{{ static('js/jquery.pagination.min.js') }}"></script>
<script type="text/javascript">$(function () {$('#pagination').pagination({currentPage: {{ page.number }},totalPage: {{ paginator.num_pages }},callback: function (current) {window.location.href = '/search/?q={{ query }}&page=' + current;}})});
</script>
</body>
</html>

在settings.py中增加HAYSTACK_SEARCH_RESULT_PER_PAGE控制結果頁面顯示的搜索記錄數量。

HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915437.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915437.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915437.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《使用Qt Quick從零構建AI螺絲瑕疵檢測系統》——0. 博客系列大綱

目錄【《使用Qt Quick從零構建AI螺絲瑕疵檢測系統》系列簡介】第一部分&#xff1a;基礎入門與項目啟航第二部分&#xff1a;核心視覺算法開發第三部分&#xff1a;模擬完整工業流程第四部分&#xff1a;軟件打包與高級特性【《使用Qt Quick從零構建AI螺絲瑕疵檢測系統》系列簡…

【Python】Python中的循環語句

循環語句導讀一、基本概念1.1 循環語句的執行流程1.2 循環語句的分類二、while語句三、for語句四、break與continue五、死循環六、循環中的else語句七、range()函數結語導讀 大家好&#xff0c;很高興又和大家見面啦&#xff01;&#xff01;&#xff01; 在上一篇內容中我們…

docker|Linux|以centos基礎鏡像為基礎制作nmap專用鏡像(鏡像瘦身計劃)

一、 最近由于某些場景下需要使用nmap&#xff0c;而nmap的rpm安裝包在源目標機器上使用有軟件沖突&#xff0c;因此&#xff0c;計劃使用docker部署nmap 具體計劃為 1、使用centos的基礎鏡像&#xff0c;在有網環境下&#xff0c;通過配置阿里云的yum倉庫&#xff0c;在cen…

基于單片機公交車報站系統/報站器

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽??????? 概述 公交車自動報站系統利用單片機作為核心控制器&#xff0c;結合GPS/北斗定位模塊、語音存…

Oracle 體系結構學習

1 認識Oracle后臺進程Oracle數據庫后臺進程是Oracle數據庫管理系統&#xff08;DBMS&#xff09;的核心組件&#xff0c;它們在后臺運行&#xff0c;負責數據庫的各種管理和維護任務。主要包括以下幾種&#xff1a;SMON (System Monitor)SMON負責數據庫的恢復操作&#xff0c;如…

構建一種安全的老式測試儀,用于具有限流燈泡,模擬儀表和可變輸出的交流設備

這個復古電路和電源測試儀的想法來自我需要一個簡單&#xff0c;安全&#xff0c;時尚的工具來測試和控制工作臺上的線路供電設備。商業解決方案要么太笨重&#xff0c;太昂貴&#xff0c;要么缺乏我喜歡的觸覺和模擬魅力。所以我決定自己造一個。這個測試儀的核心是一個老式的…

Redis5:Redis的Java客戶端——Jedis與SpringDataRedis詳解

目錄 1、Jedis客戶端 1.1使用過程 2、SpringDataRedis 2.1 SpingDataRedis介紹 2.2SpringDataRedis快速入門 2.3RedisTemplate的RedisSerializer 2.3.1RedisTemplate中JDK序列化局限性 2.3.2方式一&#xff1a;改變RedisTemplate的序列化方式 2.3.3RedisTemplate存儲一…

零基礎 “入坑” Java--- 十三、再談類和接口

文章目錄一、Object類1.獲取對象信息2.對象比較&#xff1a;equals方法二、再談接口1.比較相關接口2.Cloneable接口和深拷貝三、內部類1.匿名內部類2.實例內部類3.靜態內部類4.局部內部類在之前的學習中&#xff0c;我們已經了解了有關類以及接口的知識&#xff0c;在本章節中&…

Spring Boot 一個注解搞定「加密 + 解密 + 簽名 + 驗簽」

Spring Boot 一個注解搞定「加密 解密 簽名 驗簽」本文基于 Spring Boot 3.x&#xff0c;通過一個自定義注解 AOP&#xff0c;一行注解即可給任何 Controller 方法加上 請求解密 → 驗簽 → 響應加密 → 加簽 的完整鏈路&#xff0c;并可直接拷貝到生產環境使用。一、最終效…

《計算機網絡》實驗報告二 IP協議分析

目 錄 1、實驗目的 2、實驗環境 3、實驗內容 3.1 tcpdump 基本用法 3.2 wireshark基本用法 3.3 利用tcpdump抓包&#xff0c;wireshark分析包 4、實驗結果與分析 4.1 tcpdump命令的基本用法 4.2 wireshark的基本用法 4.3 利用tcpdump抓包&#xff0c;wireshark分析包…

k8s學習記錄(三):Pod基礎-Node選擇

一、前言 在上一篇文章中我們學習了Pod的一些基本的知識&#xff0c;今天我們將繼續學習Pod。 二、K8S如何選擇節點來運行Pod 我們知道在一個K8S集群中&#xff0c;會有多個工作節點&#xff08;Worker Node&#xff09;&#xff0c;那么k8s會選擇那個node呢&#xff1f;接下…

3天功能開發→3小時:通義靈碼2.0+DEEPSEEK實測報告,單元測試生成準確率92%的秘密

活動鏈接&#xff1a;https://developer.aliyun.com/topic/lingma-aideveloper?spma2c6h.29979852.J_9593490300.2.49b8110eeymlF8 前言 隨著人工智能技術的迅猛發展&#xff0c;AI 賦能編程成為了必然趨勢。通義靈碼應運而生&#xff0c;它是阿里巴巴集團在人工智能與編程領…

【小沐學GIS】基于Rust繪制三維數字地球Earth(Rust、OpenGL、GIS)

&#x1f37a;三維數字地球GIS系列相關文章如下&#x1f37a;&#xff1a;1【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐學GI…

ARM 學習筆記(三)

參考文獻&#xff1a;《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》《ARM Cortex-A (ARMv7-A) Series Programmer’s Guide》1、內存類型 ARMv7-A 處理器中&#xff0c;將 Memory 定義為幾種類型&#xff08;Memory Type&#xff09;&#xff1a; Strong…

Flask 框架(一):核心特性與基礎配置

目錄 一、為什么選擇 Flask&#xff1f; 二、Flask 核心概念與初始化 2.1 程序實例初始化 2.2 運行配置&#xff1a;app.run () 參數詳解 2.3 應用配置&#xff1a;三種參數設置方式 1. 字典直接配置&#xff08;簡單臨時場景&#xff09; 2. 配置文件導入&#xff08;生…

社交圈子系統開源社交源碼 / 小程序+H5+APP 多端互通的底層技術分析

伴隨社交產品向“圈子化”、“內容驅動”發展方向演進&#xff0c;打造一套支持小程序、H5、APP 互通的社交圈子系統&#xff0c;已經成為構建垂直社區的基礎架構能力要求。本文圍繞一套典型的多端社交興趣平臺&#xff08;即友貓社區平臺&#xff09;的設計實踐&#xff0c;對…

gitlab-runner配置問題記錄

引言 筆者曾通過2種方式部署過 gitlab-runner&#xff0c;在 gitlab 中使用這個 runner 拉起 ci job 的過程中或多或少遇到些問題&#xff0c;主要都是 job 中無法訪問宿主機的docker 等組件。本篇文檔主要記錄 gitlab-runner 安裝及相關配置。 二進制部署 gitlab-runner 部署 …

每日面試題10:令牌桶

令牌桶算法&#xff1a;優雅的流量控制藝術在現代分布式系統中&#xff0c;流量控制如同交通信號燈般重要——它既不能讓請求"堵死"系統&#xff0c;也不能放任流量"橫沖直撞"。令牌桶算法&#xff08;Token Bucket Algorithm&#xff09;正是這樣一種精妙…

【java】消息推送

文章目錄Java網頁消息推送解決方案 短輪詢、長輪詢、SSE、Websocket

STM32 | 有源蜂鳴器響,無源蜂鳴器播音樂

目錄 Overview 有源蜂鳴器 無源蜂鳴器 有源蜂鳴器控制 GPIO配置 控制程序 無源蜂鳴器控制 反轉GPIO控制 GPIO配置 控制接口 PWM控制 GPIO配置 控制函數 改變頻率播音樂 原理 1. 頻率決定音調 2. 占空比決定音量 GPIO初始化 結構體定義和音符頻率表 播放接口 …