ELK 設(shè)置定時(shí)清理腳本清理索引
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)容。