做網(wǎng)站軟件html css百度灰色關(guān)鍵詞代做
簡介
ElasticSearch簡介:簡稱為es, es是一個(gè)開源的高擴(kuò)展的分布式全文檢索引擎,它可以近乎實(shí)時(shí)的存儲、檢索數(shù)據(jù);本身擴(kuò)展性很好,可以擴(kuò)展到上百臺服務(wù)器,處理PB級別的數(shù)據(jù)。es也使用Java開發(fā)并使用Lucene作為其核心來實(shí)現(xiàn)所有索引和搜索的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的復(fù)雜性,從而讓全文搜索變得簡單個(gè)開源的分布式搜索引擎,可以用來實(shí)現(xiàn)搜索,日志統(tǒng)計(jì),分析,系統(tǒng)監(jiān)控等多種功能。
Elastic Stack(ELK):是以Elasticsearch為核心的技術(shù)棧,其中包括beats。logstash,kibanba,Elasticsearch。
正向索引和倒排索引
正向索引,假設(shè)我們有一個(gè)商品表,id是主鍵
如果我們按照id查詢數(shù)據(jù),他會走索引,查詢效率很快,但是一般來說我們是會按照title來搜索,sql語句如下:
select * from good where title like “%手機(jī)%”
他查詢需要全表掃描,一個(gè)個(gè)去匹配,效率可想而知,這就是正向索引,他在做局部內(nèi)容檢索的時(shí)候效率十分底。
倒排索引
文檔:每條數(shù)據(jù)就是一個(gè)文檔,類似于數(shù)據(jù)庫中一張表的一條數(shù)據(jù)
詞條:就是把文檔分成一個(gè)個(gè)詞語
假如同樣我們搜索華為手機(jī),基于倒排索引,他首先會將華為手機(jī)進(jìn)行分詞,獲得文檔id之后基于id進(jìn)行查詢文檔,這時(shí)候雖然經(jīng)過兩次檢索,但是每次都是基于索引的,總的來說,效率很高。
MySQL和Es的概念對比
Mysql:擅長事務(wù)類型操作,可以確保數(shù)據(jù)的安全和一致性
Elasticsearch:擅長海量數(shù)據(jù)的搜索、分析、計(jì)算
安裝Elasticsearch和kibana
安裝Elasticsearch
我們這里繼續(xù)使用docker來安裝
1,創(chuàng)建一個(gè)網(wǎng)絡(luò),因?yàn)槲覀冃枰宬ibana容器和es互聯(lián)
docker network create es-net
2,拉取鏡像
docker pull elasticsearch
?但是es有差不多一個(gè)G拉取速度太慢,建議下載制作好的文件,上傳,直接加載成鏡像,例如上傳es.tar將他加載為鏡像,速度會很快。
?如果你直接拉取的鏡像這個(gè)命令不需要執(zhí)行:
docker load -i es.tar
3,運(yùn)行es容器
docker run -d \--name es \-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \-e "discovery.type=single-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugins:/usr/share/elasticsearch/plugins \--privileged \--network es-net \-p 9200:9200 \-p 9300:9300 \
elasticsearch:7.12.1
命令解釋:
-
-e "cluster.name=es-docker-cluster"
:設(shè)置集群名稱 -
-e "http.host=0.0.0.0"
:監(jiān)聽的地址,可以外網(wǎng)訪問 -
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"
:內(nèi)存大小,因?yàn)樗腔趈ava開發(fā)的 -
-e "discovery.type=single-node"
:非集群模式 -
-v es-data:/usr/share/elasticsearch/data
:掛載邏輯卷,綁定es的數(shù)據(jù)目錄 -
-v es-logs:/usr/share/elasticsearch/logs
:掛載邏輯卷,綁定es的日志目錄 -
-v es-plugins:/usr/share/elasticsearch/plugins
:掛載邏輯卷,綁定es的插件目錄 -
--privileged
:授予邏輯卷訪問權(quán) -
--network es-net
:加入一個(gè)名為es-net的網(wǎng)絡(luò)中 -
-p 9200:9200
:端口映射配置
4,瀏覽器輸入ip:9200如果出現(xiàn)
?安裝成功!!!!
安裝Kibana
kibana可以給我們提供一個(gè)elasticsearch的可視化界面,便于我們更方便使用es
1,拉取鏡像
docker pull kibana
這里還是建議上傳打包好的鏡像,將他重新加載成鏡像,如果直接拉取不需要執(zhí)行這個(gè)命令
docker load -i kibana.tar
?2,啟動(dòng)kibana容器
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601 \
kibana:7.12.1
命令解釋:
-
--network es-net
:加入一個(gè)名為es-net的網(wǎng)絡(luò)中,與elasticsearch在同一個(gè)網(wǎng)絡(luò)中 -
-e ELASTICSEARCH_HOSTS=http://es:9200"
:設(shè)置elasticsearch的地址,因?yàn)閗ibana已經(jīng)與elasticsearch在一個(gè)網(wǎng)絡(luò),因此可以用容器名直接訪問elasticsearch -
-p 5601:5601
:端口映射配置
3,瀏覽器輸入ip:5601即可查看-(啟動(dòng)較慢,稍等一會)
安裝成功!!!
ES-操作索引庫(類似MySQL的表)
mapping屬性
mapping是對索引庫中文的約束,常見的mapping屬性包括:
type:字段數(shù)據(jù)類型,常見的簡單類型有:
? ? ? ? 字符串:text(可分詞文本),keyword(不可分詞,例如國家,品牌,ip等等)
? ? ? ? 數(shù)值:long,integer,short,double,float
? ? ? ? 布爾:boolean
? ? ? ? 日期:date
? ? ? ? 對象:object
index:是否創(chuàng)建索引,默認(rèn)為true。
analyzer:使用那種分詞器。
properties:子字段,對象嵌套時(shí)需要。
創(chuàng)建索引庫-類似于數(shù)據(jù)庫的表
假如我們數(shù)據(jù)庫有一個(gè)用戶表,其中一條數(shù)據(jù)如下:
{ "id": 1, "age": 21, "weight": 52.1, "isMarried": false, "info": "csdn最靚的崽!!", "email": "gde@nb.cn", "scores": [ 99.1,99.5,98.9], "name": { "firstName": "蛋兒", "lastName": "狗" }
}
不難看出數(shù)據(jù)庫表如何創(chuàng)建的,我們來看看在es中如何創(chuàng)建 索引庫
這是一個(gè)示例:
# 創(chuàng)建索引庫
PUT /索引庫名稱
{"mappings": {"properties": {"字段1":{"type":"類型,例如text",, "analyzer": "使用哪種分詞器"},"字段2":{"type": "類型,例如keyword","index": false # 不適用索引},"字段3":{"properties": {"子字段1";{"type":"字段類型"},"子字段2";{"type":"字段類型"}}}}}
}
?實(shí)現(xiàn)之后(我們?nèi)∩倭孔侄?:
# 創(chuàng)建索引庫
PUT /userinfo
{"mappings": {"properties": {"info":{"type":"text","analyzer": "ik_smart"},"email":{"type": "keyword","index": false },"age":{"type": "integer","index": false},"name":{"properties": {"dirstName":{"type":"keyword"},"lastName":{"type":"keyword"}}}}}
}
?注意:索引名必須小寫!!
索引庫查詢
GET /索引庫名
索引庫刪除
DELETE /索引庫名
索引庫修改
需要注意的是es在索引庫創(chuàng)建的時(shí)候就會基于索引庫創(chuàng)建倒排索引,如果修改索引庫結(jié)構(gòu)倒排索引就會失效,所以,es是不允許修改索引庫的,但是可以在索引庫中增加新的字段。
# 向索引庫中增加一個(gè)字段
PUT /索引庫名/_mapping
{"properties":{"新字段名":{"type":"字段類型"}}
}
Es-操作文檔
(類似MySQL的數(shù)據(jù))
?索引庫插入一條文檔
示例語句:
# 向索引庫中插入一條數(shù)據(jù)
POST /userinfo/_doc/文檔id,例如1,2。。。
{"字段1":"值1","字段2":"值2","字段3":{"子屬性1":"值3","子屬性2":"值4"}
}
具體實(shí)現(xiàn):
# 向索引庫中插入一條數(shù)據(jù)
POST /userinfo/_doc/1
{"info":"csdn最靚的崽!!","email":"gde@nb.cn","age":"20","name":{"dirstName":"狗","lastName":"蛋兒"}
}
索引庫查詢的文檔
# 查詢id為1的數(shù)據(jù)
GET /索引庫名/_doc/1#查詢所有數(shù)據(jù)
GET /userinfo/_search
{ "query": { "match_all": {} }
}
索引庫刪除一條文檔
#刪除id為1的數(shù)據(jù)
DELETE /userinfo/_doc/1
索引庫修改文檔
1,全量修改
原本插入文檔使用的是POST請求這時(shí)候只需要換成PUT請求即可,它會將原有的文檔刪除在重新插入,例如:
# 全量修改 修改索引庫中id為1的數(shù)據(jù),如果不存在就插入
PUT /userinfo/_doc/1
{"info":"csdn最靚的崽!!","email":"gde@nb.cn","age":"20","name":{"dirstName":"狗","lastName":"蛋兒"}
}
2,局部修改
# 局部修改
POST /userinfo/_update/1
{"doc": {"age":"99"}
}
至此es基礎(chǔ)篇完結(jié)!!!!!!