【愚公系列】2022年02月 Django商城項(xiàng)目 26-搜索引擎功能實(shí)現(xiàn)

      網(wǎng)友投稿 994 2025-04-02

      一、全文檢索和搜索引擎原理


      1.商品搜索需求

      當(dāng)用戶在搜索框輸入商品關(guān)鍵字后,我們要為用戶提供相奐的商品搜索結(jié)果。

      2.商品搜索實(shí)現(xiàn)

      可以選擇使用模糊查詢like突鍵字實(shí)現(xiàn)。

      但是like關(guān)鍵字的效率極低。

      查詢需要在多個(gè)字段中進(jìn)行,使用like關(guān)鍵字也不方便。

      3.全文檢索方案

      我們引入全文檢索的方案來實(shí)現(xiàn)商品搜索。

      全文檢索即在指定的任意字段中進(jìn)行檢索查詢。

      全文檢索方案需要配合搜索引擎來實(shí)現(xiàn)。

      4.搜索引擎原理

      搜索引擎進(jìn)行全文檢索時(shí),會(huì)對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行一遍預(yù)處理,單獨(dú)建立起一份索引結(jié)構(gòu)數(shù)據(jù)。

      索引結(jié)構(gòu)數(shù)據(jù)類似新華字典的索引檢索頁,里面包含了關(guān)鍵詞與詞條的對(duì)應(yīng)失系,并記錄詞條的位置。

      搜索引擎進(jìn)行全文檢索時(shí),將關(guān)鍵字在索引數(shù)據(jù)中進(jìn)行快速對(duì)比查找,進(jìn)而找到數(shù)據(jù)的真實(shí)存儲(chǔ)位置。

      二、elasticsearch介紹

      實(shí)現(xiàn)全文檢索的搜索引擎,首選的是elasticsearch

      Elasticsearch是用Java實(shí)現(xiàn)的,開源的搜索引擎。

      它可以快速地儲(chǔ)存、搜索和分析海量數(shù)據(jù)。維基百科、Stack Overflow Github等都采用它。

      Elasticsearch的底層是開源庫Lucene。但是,沒法直接使用Lucene,必須自己寫代碼去調(diào)用它的接口。

      分詞說明

      搜索引擎在對(duì)數(shù)據(jù)構(gòu)建索引時(shí),需要進(jìn)行分詞處理。

      分詞是指將一句話拆解成多個(gè)單字或詞,這些字或詞便是這句話的奐鍵詞。 比如:我是中國(guó)人

      分詞后:我、是、中、國(guó)、人、中國(guó)等等都可以是這句話的關(guān)鍵字。

      Elasticsearch不支持對(duì)中文進(jìn)行分詞建立索引,需要配合擴(kuò)展elasticsearch-analysis-ik來實(shí)現(xiàn)中文

      三、Docker安裝Elasticsearch

      獲取鏡像,可以通過網(wǎng)絡(luò)pull

      docker image pull delron/elasticsearch-ik:2.4.6-1.0

      或者用自己拉取好的鏡像文件:

      docker load -i elasticsearch-ik-2.4.6_docker.tar

      修改elasticsearch的配置文件 elasticsearc-2.4.6/config/elasticsearch.yml第54行,更改ip地址為本機(jī)ip地址

      network.host: 127.0.0.1

      創(chuàng)建docker容器運(yùn)行

      docker run -dti --network=host --name=elasticsearch -v /home/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config Desktop/elasticsearch-ik:2.4.6-1.0

      出現(xiàn)如下表示服務(wù)已經(jīng)成功運(yùn)行了

      四、haystack擴(kuò)展建立索引

      1. Haystack介紹和安裝配置

      1.1 Haystack介紹

      Haystack是在Django中對(duì)接搜索引擎的框架,搭建了用戶和搜索引擎之間的溝通橋梁。

      我們?cè)贒jango中可以通過使用Haystack來調(diào)用Elasticsearch搜索引擎。

      Haystack可以在不修改代碼的情況下使用不同的搜索后端(比如Elasticsearch、whoosh、Solr等等)。

      1.2 Haystack安裝

      pip install django-haystack pip install elasticsearch==2.4.6

      1.3 Haystack注冊(cè)應(yīng)用和路由

      應(yīng)用配置中加上如下應(yīng)用

      INSTALLED_APPS = [ "haystack',#全文檢索 ] # Haystack HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://127.0.0.1:9200/', # 此處為elasticsearch運(yùn)行的服務(wù)器ip地址,端口號(hào)固定為9200 'INDEX_NAME': 'xxshopping', # 指定elasticsearch建立的索引庫的名稱 }, } # 當(dāng)添加、修改、刪除數(shù)據(jù)時(shí),自動(dòng)生成索引 HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

      創(chuàng)建search_indexes.py在對(duì)應(yīng)的商品目錄下

      from haystack import indexes from apps.goods.models import SKU class SKUIndex(indexes.SearchIndex,indexes.Indexable): # 每個(gè)都SearchIndex需要有一個(gè)(也是唯一一個(gè))字段 document=True。 # 這向Haystack和搜索引擎指示哪個(gè)字段是用于在其中搜索的主要字段。 #允許我們使用數(shù)據(jù)模板(而不是容易出錯(cuò)的串聯(lián))來構(gòu)建搜索引擎將索引的文檔 # 'name,caption,id' #慣例是命名此字段text text = indexes.CharField(document=True, use_template=True) def get_model(self): # 返回對(duì)哪個(gè)模型進(jìn)行檢索 return SKU def index_queryset(self, using=None): #對(duì)哪些數(shù)據(jù)進(jìn)行檢索 return self.get_model().objects.filter(is_launched=True) # return self.get_model().objects.all() # return SKU.objects.all() # pass # class SPUIndex(indexes.SearchIndex, indexes.Indexable): # # 每個(gè)都SearchIndex需要有一個(gè)(也是唯一一個(gè))字段 document=True。 # # 這向Haystack和搜索引擎指示哪個(gè)字段是用于在其中搜索的主要字段。 # # # 慣例是命名此字段text # text = indexes.CharField(document=True, use_template=True)

      在模板里新建sku_text.txt文件

      # 在這里我們指定 對(duì)模型的哪些字段進(jìn)行檢索 # object 可以理解為 SKU的實(shí)例對(duì)象 {{ object.name }} {{ object.caption }} {{ object.id }}

      在全局路由文件下添加

      re_path('^search/', include('haystack.urls'))

      添加視圖search.html

      小徐商城-商品搜索

      最后創(chuàng)建建立索引的數(shù)據(jù):

      python manage.py rebuild_index

      選 y

      此時(shí), 在我們的數(shù)據(jù)庫中就有了我們索引的數(shù)據(jù);

      1.4測(cè)試

      /search/?q=查詢產(chǎn)生

      五、自定義頁面訪問

      1.創(chuàng)建索引類

      2.創(chuàng)建序列化器

      3.最后創(chuàng)建建立索引的數(shù)據(jù)

      python manage.py rebuild_index

      選Y

      4.創(chuàng)建視圖

      5.創(chuàng)建索引的序列器

      6.在我們應(yīng)用的路由中進(jìn)行注冊(cè)

      最后就是設(shè)置我們前端的search.html 的頁面,及對(duì)應(yīng)的js加載文件;

      Elasticsearch 實(shí)時(shí)流計(jì)算服務(wù) CS 搜索引擎

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:WPS文字怎么設(shè)置字符底紋呢?字符底紋設(shè)置方法
      下一篇:HDC.Cloud 2021 | 華為云發(fā)布重磅新品,全棧云原生技術(shù)能力持續(xù)創(chuàng)新升級(jí)
      相關(guān)文章
      日韩亚洲国产二区| 亚洲精品福利在线观看| 亚洲日本中文字幕区| 亚洲综合区小说区激情区| 亚洲av中文无码乱人伦在线观看 | 亚洲精品国产高清嫩草影院| 精品久久久久久亚洲精品| 麻豆亚洲av熟女国产一区二| 亚洲伊人色欲综合网| 亚洲Av无码国产情品久久| 亚洲色成人网站WWW永久四虎| 91亚洲精品麻豆| 亚洲国产国产综合一区首页| 国产av无码专区亚洲av果冻传媒| 亚洲а∨天堂久久精品| 亚洲人成综合网站7777香蕉| 亚洲国产亚洲综合在线尤物| 中文字幕亚洲综合久久2| 亚洲AV无码精品无码麻豆| 亚洲中文字幕久久精品无码APP| 最新国产AV无码专区亚洲 | 亚洲高清免费视频| 色噜噜噜噜亚洲第一| 亚洲欧美日韩中文无线码| 亚洲粉嫩美白在线| 亚洲人成www在线播放| 亚洲国产精品免费观看| 亚洲av日韩av综合| 亚洲videos| 亚洲欧洲另类春色校园网站| 亚洲www在线观看| 2020国产精品亚洲综合网| 久久精品国产亚洲av麻豆蜜芽| 亚洲手机中文字幕| 亚洲黄色免费在线观看| 777亚洲精品乱码久久久久久 | 日韩精品成人亚洲专区| 久久久久亚洲爆乳少妇无| 亚洲真人无码永久在线| 亚洲乱码一区二区三区在线观看 | 亚洲国产女人aaa毛片在线|