ES
1. ES的原理和基本概念
ES一般使用保存日志數(shù)據(jù),對(duì)數(shù)據(jù)做日志做一些管理,ElasticSearch(resful風(fēng)格)數(shù)據(jù)只有json類型的,
ElastricSearch和Solr都是基于Lucene的全文搜索引擎服務(wù)器
Lucene:
apache的子項(xiàng)目開(kāi)源的全文搜索引擎工具包
倒排索引:
通過(guò)term或者說(shuō)某個(gè)詞記錄其所在的文檔的地址,來(lái)查找文檔中的內(nèi)容
Lucence的內(nèi)部結(jié)構(gòu)
索引:一個(gè)索引對(duì)應(yīng)一個(gè)文件夾,文件夾里的分件構(gòu)成一個(gè)Luence索引
段:一個(gè)索引可以包含多個(gè)段 段相互獨(dú)立也可以合并,添加文檔(doc)也會(huì)添加段
文檔:文檔是Lucence最小的單位,不同的文檔存在不同的段中,每個(gè)段可以存多個(gè)文檔
域(字段):一篇文檔中有多個(gè)字段,可以存在不同的域中
詞:是索引最小的單位,經(jīng)過(guò)詞法分析或者語(yǔ)言處理后的字符串? 索引(index) -----> 數(shù)據(jù)庫(kù)
? 類型(type)-----> 表
? 文檔(doc)-----> 行
? 字段(fields)-----> 列
? term (項(xiàng)) -----> 里面的某個(gè)字符分詞:ik分詞器
對(duì)于一些沒(méi)有意義的詞不建立索引,不使用,不與doc文檔地址鏈接
keyword 不進(jìn)行分詞不做拆分,直接根據(jù)字符串的內(nèi)容建立反向索引
text 進(jìn)行分詞 根據(jù)分詞建立反向索引
Elasticsearch分布式
分布式節(jié)點(diǎn)是對(duì)等,選出一個(gè)Master然后Master負(fù)責(zé)進(jìn)行寫入和更新操作,而且Elasticsearch會(huì)對(duì)數(shù)據(jù)進(jìn)行切分,同每個(gè)分片也會(huì)保存多個(gè)副本保證高可可用
只有建立索引和類型需要經(jīng)過(guò)master
數(shù)據(jù)的寫入有一簡(jiǎn)單的路由規(guī)則,可以route到集群的任意節(jié)點(diǎn),所以數(shù)據(jù)寫入壓力是分散在整個(gè)集群中的
可以做搜索和日志分析加上kibana
2. ES和Kibana的下載與安裝
-
ES下載地址
-
Kibana下載地址
-
ES和Kibanna的對(duì)照表
-
es安裝步驟 (es安裝真的坑)
# 1. 修改es 內(nèi)存配置,不然啟動(dòng)不起來(lái) vim /nikaboy/elasticsearch-8.2.2/config/jvm.options -Xms512m -Xmx512m # 2. 創(chuàng)建一個(gè)普通用戶,es無(wú)法在root用戶進(jìn)行操作 useradd es passwd es chown -R es /nikaboy/elasticsearch-8.2.2 # 配置es用戶對(duì)文件目錄的權(quán)限 # 3. 編輯 /etc/security/limits.conf es soft nofile 65536 es hard nofile 65536 es soft nproc 4096 es hard nproc 4096 # 4. 編輯 /etc/security/limits.d/20-nproc.conf,將* 改為用戶名(es) es soft nproc 4096 root soft nproc unlimited # 5. vi 編輯 /etc/sysctl.conf vm.max_map_count = 655360 # 6.配置application.yml # 7. su es 切換到es用戶 nohup ./bin/elasticsearch > msg.log 2>&1 & # 后臺(tái)啟動(dòng)es # 8. 訪問(wèn) http://192.168.10.10:9200/
es的application.yml文件
cluster.name: my-application #集群名稱 node.name: node-1 #節(jié)點(diǎn)名稱 #數(shù)據(jù)和日志的存儲(chǔ)目錄 path.data: /nikaboy/elasticsearch-8.2.2/db/data path.logs: /nikaboy/elasticsearch-8.2.2/db/logs #設(shè)置綁定的ip,設(shè)置為0.0.0.0以后就可以讓任何計(jì)算機(jī)節(jié)點(diǎn)訪問(wèn)到了 network.host: 0.0.0.0 http.port: 9200 #端口 #設(shè)置在集群中的所有節(jié)點(diǎn)名稱,這個(gè)節(jié)點(diǎn)名稱就是之前所修改的,當(dāng)然你也可以采用默認(rèn)的也行,目前是單機(jī),放入一個(gè)節(jié)點(diǎn)即可 cluster.initial_master_nodes: ["node-1"] #----------------------- BEGIN SECURITY AUTO CONFIGURATION ----------------------- # # The following settings, TLS certificates, and keys have been automatically # generated to configure Elasticsearch security features on 08-11-2022 13:02:52 # # -------------------------------------------------------------------------------- # Enable security features xpack.security.enabled: false # 關(guān)閉ssl認(rèn)證 xpack.security.enrollment.enabled: true # Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents xpack.security.http.ssl: enabled: false # 關(guān)閉ssl認(rèn)證 keystore.path: certs/http.p12 # Enable encryption and mutual authentication between cluster nodes xpack.security.transport.ssl: enabled: true verification_mode: certificate keystore.path: certs/transport.p12 truststore.path: certs/transport.p12 #----------------------- END SECURITY AUTO CONFIGURATION -------------------------
-
安裝Kibanna(可視化監(jiān)控es)
-
配置kibanna的yml文件 (cd /nikaboy/kibana-8.2.2/config)
server.port: 5601 server.host: "0.0.0.0" server.name: "kibana" elasticsearch.hosts: ["http://127.0.0.1:9200/"] i18n.locale: "zh-CN"
-
切換普通用戶啟動(dòng) 訪問(wèn)
nohup ./bin/kibana >msg.log 2>&1 & #訪問(wèn)地址 http://192.168.10.10:5601/
-
-
3.ES使用
- kibaba的使用
-
索引增刪改查
# 創(chuàng)建一個(gè)索引 PUT /nikaboy { "settings": { "number_of_shards": 5, ## 分片數(shù)量 默認(rèn)為1 "number_of_replicas": 1 ## 備份數(shù)量 默認(rèn)為1 } } # 查看索引 GET /nikaboy # 刪除索引 DELETE /nikaboy
-
ES中Field可以指定的類型
字符串String:
text:一般用于全文檢索。將當(dāng)前的field進(jìn)行分詞
keyword: 當(dāng)前的Field不可被分詞
數(shù)值類型Numeric:
long,
integer,
short,
byte,
double,
float,
half_float,
scaled_float
時(shí)間類型Data:
date,可以指定具體的格式
布爾類型Boolean:
boolean
二進(jìn)制類型Binary:
binary
范圍類型Range:
integer_range, float_range, long_range, double_range, date_range
經(jīng)緯度類型:
geo_point:用來(lái)存儲(chǔ)經(jīng)緯度
ip類型:
ip:可以存儲(chǔ)ipv4或者ipv6
-
增刪改數(shù)據(jù)
-
創(chuàng)建包含數(shù)據(jù)結(jié)構(gòu)的索引
PUT /student { "settings": { "number_of_shards": 5, "number_of_replicas": 1 }, "mappings": { "properties":{ "name":{ "type":"text" }, "age":{ "type":"integer" }, "sex":{ "type":"byte" }, "native":{ "type":"keyword" }, "birthDate":{ "type":"date" }, "sno":{ "type":"keyword" } } } }
-
可能會(huì)遇到問(wèn)題:Failed to parse mapping: Root mapping definition has unsupported parameters…在7.+版本,已經(jīng)不支持索引創(chuàng)建type,默認(rèn)類型是_doc
-
給類型字段增刪改
## 給student 增加 class_name 字段 PUT /student/_mapping { "properties":{ "class_name":{ "type":"text" } } } ## 增加某個(gè)學(xué)生的某個(gè)字段 POST /student/_update/12345678 { "script": { "source": "ctx._source.price=34" } } ## 刪除某個(gè)學(xué)生的某個(gè)字段 POST /student/_update/12345678 { "script": { "source":"ctx._source.remove(\"price\")" } }
-
增加數(shù)據(jù)
## 增加數(shù)據(jù) POST /student/_doc { "name": "小王", "sex": 1, "birthDate" : "2020-11-11", "class_name" : "計(jì)算機(jī)科學(xué)一班", "native": "廣州天河區(qū)", "sno": "12345678", "age": "2" } ## 查看數(shù)據(jù) POST /student/_search { "query": { "match_all": { } } } ## 根據(jù)id刪除某條數(shù)據(jù) DELETE /student/_doc/cW-LZ4QBLCdlaqLEGlVK ## 根據(jù)id修改某個(gè)字段的數(shù)據(jù) POST /student/_update/cG-KZ4QBLCdlaqLE6lUF { "doc": { "name":"小雅" } } ## script 腳本方式 更新數(shù)據(jù) 將id為12345678的學(xué)生班級(jí)名修改為二班 POST /student/_update/12345678 { "script":{ "source": "ctx._source.class_name = params.class_name", "params": { "class_name":"計(jì)算機(jī)科學(xué)二班" } } } ## ## 創(chuàng)建一個(gè) script 腳本 POST _scripts/my_scripts_01 { "script":{ "source": "ctx._source.class_name = params.class_name", "lang": "painless" } } ## 查看script腳本 GET _scripts/my_scripts_01 ## 刪除script腳本 DELETE _scripts/my_scripts_01 ##使用腳本 POST /student/_update/12345678 { "script":{ "id":"my_scripts_01", "params": { "class_name":"計(jì)算機(jī)科學(xué)三班" } } } ## 找到出name為小雅學(xué)生 修改為 小愛(ài) POST /student/_update_by_query { "query": { "match_phrase": { "name":"小雅" } }, "script": { "source": "ctx._source.name=params.name;ctx._source.class_name=params.class_name", "lang": "painless", "params": { "name":"小愛(ài)", "class_name":"二班" } } }
ES內(nèi)部對(duì)partial update的實(shí)際執(zhí)行,跟傳統(tǒng)的全量替換方式,是幾乎一樣的
1.內(nèi)部先獲取document
2.將傳過(guò)來(lái)的field更新到document的json中
3.將老的document標(biāo)記為deleted
4.將修改后的新的document創(chuàng)建出來(lái)
-
查詢數(shù)據(jù)
-
查看篩選字段
POST /student/_search { "query": { "match_all": { } }, "_source": ["age","name","sno"] # 只顯示_doc的這三個(gè)字段 ,類似 mysql的 Select age,name,sno from student }
-
分頁(yè)類似mysql的 limit 和 排序 order by
## 分頁(yè) 0 - 3 POST /student/_search { "query": { "match_all": { } }, "from": 0, "size": 3 } ## 根據(jù) age 去排序 POST /student/_search { "query": { "match_all": { } }, "sort": [ { "age": { "order": "desc" } } ], "from": 0, "size": 3 }
-
terms 和term的使用,根據(jù)term 找到整個(gè)文檔,如果字段可以分詞,則模糊查出數(shù)據(jù),如果不能能分詞則需要數(shù)據(jù)字段中所有的數(shù)據(jù)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-660363.html
{ "query": { "terms": { "name": [ "小", "雅" ] } }, "from": 0, "size": 3 } ## native 數(shù)據(jù)類型為keyword 無(wú)法分詞,不是模糊查詢 POST /student/_search { "query": { "terms": { "native": [ "廣州" ] } }, "from": 0, "size": 3 } POST /student/_search { "query": { "term": { "name":"王" } }, "from": 0, "size": 3 }
-
match的使用,是對(duì)term的封裝,如果可以分詞則把數(shù)據(jù)切割成多個(gè)term查詢,返回結(jié)果集文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-660363.html
POST /student/_search { "query": { "match": { "native":"廣州天河區(qū)" } }, "from": 0, "size": 3 } POST /student/_search { "query": { "match": { "native":"廣州" } }, "from": 0, "size": 3 } POST /student/_search { "query": { "match": { "name":"小王" } }, "from": 0, "size": 3 } ## 基于一個(gè)Filed匹配的內(nèi)容,采用and或者or的方式進(jìn)行連接 POST /student/_search { "query": { "match": { "class_name":{ "query": "一班 計(jì)算機(jī)", "operator": "and" } } }, "from": 0, "size": 3 }
- multi_match的使用,一個(gè)text數(shù)據(jù)應(yīng)用在多字段上查詢的結(jié)果集合
//相當(dāng)于mysql (class_name like '%計(jì)算機(jī)%' ) or (name like '%計(jì)算機(jī)%') POST /student/_search { "query": { "multi_match": { "query": "計(jì)算機(jī)", "fields": ["class_name"
-
到了這里,關(guān)于ES完整使用從安裝到springboot項(xiàng)目操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!