Elasticsearch+Kibana·入门·壹
文章目錄
- 1 認(rèn)識elasticsearch
- 1.1 ES引入
- 1.1.1 elasticsearch作用
- 1.1.2 ES相關(guān)技術(shù)棧——ELK
- 1.1.3 elasticsearch的底層lucene
- 1.1.4 elasticsearch與其他搜索技術(shù)(Solr)對比
- 1.2 正向索引與倒排索引
- 1.2.1 正向索引
- 1.2.2.倒排索引
- 1.2.3.正向、倒排索引比較
- 1.2.4.正向、倒排索引優(yōu)缺點(diǎn)
- 1.3 es相關(guān)概念
- 1.3.1 文檔和字段
- 1.3.2.索引和映射
- 1.3.3 mysql與elasticsearch對比
- 1.3.4 DSL中屬性解釋
- 1.3.5 ES中特殊字段location、all
- 1.3.6 ES中別名aliases
- 1.4.安裝es、kibana、ik中文分詞器
- 1.4.1 IK分詞器的兩種模式
- 1.4.2 IK分詞器拓展詞條、停用詞條
- 1.4.3 kibana報錯通用解決方法
- 2 索引庫操作
- 2.1 mapping(約束)映射屬性
- 2.2.索引庫的CRUD
- 2.2.1 創(chuàng)建索引庫和映射
- 2.2.2.查詢索引庫
- 2.2.3.修改索引庫
- 2.2.4.刪除索引庫
- 3.文檔操作
- 3.1.新增文檔
- 3.2.查詢文檔
- 3.3.刪除文檔
- 3.4.修改文檔
- 3.4.1.全量修改
- 3.4.2.增量修改
- 4.RestAPI
- 4.1 根據(jù)MySQL數(shù)據(jù)庫書寫DSL
- 4.1.1 數(shù)據(jù)庫表結(jié)構(gòu)
- 4.1.2 ES的DSL
- 4.2 SpringBoot使用Java HighLevel Rest Client API
- 4.2.1 查看SpringBoot默認(rèn)的ES版本是7.6.2
- 4.2.2 maven引入API坐標(biāo)
- 4.2.3 yml添加配置
- 4.2.4 ES中9200與9300端口說明
- 4.3 創(chuàng)建索引庫
- 4.3.1 封裝DSL常量類
- 4.3.2 測試類——創(chuàng)建索引庫
- 4.3.3 RequestOptions:請求方式(同步/異步)探究
1 認(rèn)識elasticsearch
1.1 ES引入
1.1.1 elasticsearch作用
elasticsearch:一款從海量數(shù)據(jù)(百萬級別以上)中快速查找所需內(nèi)容的開源搜索引擎。
例如:電商網(wǎng)站搜索商品
1.1.2 ES相關(guān)技術(shù)棧——ELK
此篇文章著重介紹elastic stack(ELK)技術(shù)棧:elasticsearch、kibana、Logstash、Beats實(shí)現(xiàn)ES搜索引擎功能。
注意: elasticsearch是ELK的核心,負(fù)責(zé)存儲、搜索、分析數(shù)據(jù)
1.1.3 elasticsearch的底層lucene
Lucene**是一個Java語言的搜索引擎類庫,是Apache公司的頂級項目,官網(wǎng)地址:https://lucene.apache.org/ 。
1.1.4 elasticsearch與其他搜索技術(shù)(Solr)對比
1.2 正向索引與倒排索引
1.2.1 正向索引
條件:表(tb_goods)中的id創(chuàng)建索引
此時,根據(jù)表中id查詢所需數(shù)據(jù),就是正向索引
正向索引(正排索引):正排表以文檔的ID為關(guān)鍵字,查找所需信息時需掃描表中每個文檔中字的信息,直到找出所有包含所需信息的文檔。
然而,當(dāng)搜索數(shù)據(jù),條件是title符合"%手機(jī)%",
- 逐行獲取數(shù)據(jù),比如id為1的數(shù)據(jù)
- 逐行掃描(全表掃描)判斷數(shù)據(jù)中的title是否符合搜索條件
- 如若不符合,則以此循環(huán),在面對百萬級別數(shù)據(jù)時查詢效率低下。
1.2.2.倒排索引
兩個概念:
| 文檔(Document) | 用來搜索的數(shù)據(jù),對應(yīng)數(shù)據(jù)庫中,每一行數(shù)據(jù)就是一個文檔。例如:一個商品信息 |
| 詞條(Term) | 對文檔數(shù)據(jù)進(jìn)行算法拆分,得到的具備含義的詞語就是詞條。例如:我是中國人,就可以分為:我、是、中國人、中國、國人這樣的幾個詞條 |
創(chuàng)建倒排索引(正向索引的特殊處理)流程:
- ①使用算法對文檔進(jìn)行拆分,得到一個個的此詞條
- ② 創(chuàng)建表,每行數(shù)據(jù)包括詞條、詞條所在文檔id、位置等信息
- ③ 由于詞條唯一性,給詞條創(chuàng)建索引,例如hash表結(jié)構(gòu)索引
例如:對正向索引表拆分,有小米關(guān)鍵字的文檔對應(yīng)id為1\3\4,以此類推,完成拆分
倒排索引的搜索流程:
- ① 用戶輸入條件“華為手機(jī)”進(jìn)行搜索
- ② 對用戶輸入內(nèi)容分詞,得到詞條:華為、手機(jī)
- ③ 憑借詞條在倒排索引中查找,得到詞條所對應(yīng)的文檔id:1、2、3
- ④ 最后,憑借查詢得到的詞條所對應(yīng)文檔在正向索引中查詢具體文檔(正向索引表中id具有索引,查詢性能較好,無需全表掃描)
索引介紹參考:MySQL Study Notes Design in 2023
1.2.3.正向、倒排索引比較
| 正向索引傳統(tǒng)根據(jù)id索引的方式 | 倒排索引先找到用戶所需詞條 |
| 根據(jù)詞條查詢,必須逐條獲取每個文檔,然后判斷文檔中是否包含所需詞條 | 根據(jù)詞條得到相對應(yīng)文檔id,其次根據(jù)獲取id所對應(yīng)文檔。 |
1.2.4.正向、倒排索引優(yōu)缺點(diǎn)
正向索引:
| 可以給多個字段創(chuàng)建索引 | 根據(jù)非索引字段,或者索引字段中的部分詞條查找時,只能全表掃描。 |
| 根據(jù)索引字段搜索、排序速度非常快 |
倒排索引:
| 根據(jù)詞條搜索、模糊搜索時,速度非常快 | 只能給詞條創(chuàng)建索引,而不是字段 |
| 無法根據(jù)字段做排序 |
1.3 es相關(guān)概念
1.3.1 文檔和字段
文檔:ES面向文檔存儲,對應(yīng)數(shù)據(jù)庫中表中每行數(shù)據(jù)。文檔數(shù)據(jù)最終會被序列化為JSON格式存儲在ES中,其次JSON文檔中的字段對應(yīng)數(shù)據(jù)庫表中每列,也就是詞條。
1.3.2.索引和映射
索引(Index):相同類型詞條的集合
- 例如:
① 所有商品名稱詞條,可以組織在一起,稱為商品的索引;
② 所有訂單詞條,可以組織在一起,稱為訂單的索引;
映射:數(shù)據(jù)庫中字段有約束,對應(yīng)ES索引庫中就有映射(mapping)
1.3.3 mysql與elasticsearch對比
| Table | Index | 索引(index),就是文檔的集合,類似數(shù)據(jù)庫的表(table),而MySQL中索引時從0開始的下標(biāo) |
| Row | Document | 文檔(Document),就是一條條的數(shù)據(jù),類似數(shù)據(jù)庫中的行(Row),文檔都是JSON格式 |
| Column | Field | 字段/詞條(Field),就是JSON文檔中的字段,類似數(shù)據(jù)庫中的列(Column) |
| Schema | Mapping | Mapping(映射)是索引中文檔的約束,例如字段類型約束。類似數(shù)據(jù)庫的表結(jié)構(gòu)(Schema) |
| SQL | DSL | DSL是elasticsearch提供的JSON風(fēng)格的請求語句,用來操作elasticsearch,實(shí)現(xiàn)CRUD |
在企業(yè)中,MySQL常與ES結(jié)合使用:
1.3.4 DSL中屬性解釋
| _id | _id僅僅是一個字符串,與_index和_type組合時,就可以在es中唯一標(biāo)識一個文檔,當(dāng)創(chuàng)建一個文檔(相當(dāng)于數(shù)據(jù)庫中每一行數(shù)據(jù))時,可以自定義_id,也可以讓ES使用默認(rèn)UUID自動生成 |
| _index | 索引(index)類似于MySQL(database),索引名字必須全部小寫,不能以下劃線開頭,不能包含逗號。 |
| _type | 類型(type)類似于MySQL的table |
| hits | 命中,查詢返回的結(jié)果稱為命中 |
1.3.5 ES中特殊字段location、all
| location | 地理坐標(biāo),里面包含精度、緯度 |
| all | 一個組合字段,其目的是將多字段的值 利用copy_to合并,提供給用戶搜索 |
地理坐標(biāo)說明:
copy_to說明(把brand詞條copy給all詞條):
1.3.6 ES中別名aliases
示例:
別名相關(guān)解釋:
① ES中別名機(jī)制可類比數(shù)據(jù)庫中視圖。
② ES可對一個或多個索引指定別名,通過別名可以查找到一個或多個索引內(nèi)容,ES會把別名映射到對應(yīng)索引。
③ 可以對別名編寫過濾器或路由,在系統(tǒng)中別名不能重復(fù),也不能和索引名重復(fù)。
1.4.安裝es、kibana、ik中文分詞器
1.4.1 IK分詞器的兩種模式
| ik_smart | 智能切分,粗粒度 |
| ik_max_word | 最細(xì)切分,細(xì)粒度 |
1.4.2 IK分詞器拓展詞條、停用詞條
① 利用config目錄的IkAnalyzer.cfg.xml文件添加拓展詞典和停用詞典
② 在詞典中添加拓展詞條或者停用詞條
1.4.3 kibana報錯通用解決方法
重啟docker服務(wù)
systemctl restart docker已解決錯誤:
- ① your basic license does not support cross cluster replication. please upgrade
- ②docker update kibana --restart=always
2 索引庫操作
2.1 mapping(約束)映射屬性
type:字段數(shù)據(jù)類型,常見的簡單類型有:
| 字符串 | text(可分詞的文本)、keyword(不可分詞,例如:品牌、國家、ip地址) |
| 數(shù)值 | long、integer、short、byte、double、float |
| 布爾 | boolean |
| 日期 | date |
| 對象 | object |
① index:是否創(chuàng)建索引,默認(rèn)為true
② analyzer:使用哪種分詞器
③ properties:該字段的子字段
例如下面的json文檔:
- 對應(yīng)的每個字段映射(mapping):
① age:類型integer,參與搜索( “index”: true),無需分詞( “type”: “keyword”)
②weight:類型為float,參與搜索( “index”: true),無需分詞( “type”: “keyword”)
③isMarried:類型為boolean;參與搜索( “index”: true),無需分詞( “type”: “keyword”)
④info:類型為字符串,需要分詞器(type=text),參與搜索( “index”: true),需分詞器,個人選用(“analyzer”: “ik_smart”)
⑤ email:類型為字符串,參與搜索( “index”: true),無需分詞( “type”: “keyword”)
⑥ score:數(shù)組類型,但只需看元素的類型,類型為float;參與搜索( “index”: true),無需分詞( “type”: “keyword”)
⑦ name:類型為object,需定義多個子屬性
name.firstName;類型字符串,不需分詞( “type”: “keyword”);參與搜索( “index”: true)
name.lastName;類型為字符串,不需分詞( “type”: “keyword”);參與搜索( “index”: true)
2.2.索引庫的CRUD
2.2.1 創(chuàng)建索引庫和映射
基本語法:
- 請求方式:PUT
- 請求路徑:/索引庫名,可以自定義
- 請求參數(shù):mapping映射
格式:
PUT /索引庫名稱 {"mappings": {"properties": {"字段名":{"type": "text","analyzer": "ik_smart"},"字段名2":{"type": "keyword","index": "false"},"字段名3":{"properties": {"子字段": {"type": "keyword"}}},// ...略}} }示例:
PUT /heima {"mappings": {"properties": {"info":{"type": "text","analyzer": "ik_smart"},"email":{"type": "keyword","index": "falsae"},"name":{"properties": {"firstName": {"type": "keyword"}}},// ... 略}} }2.2.2.查詢索引庫
基本語法:
- 請求方式:GET
- 請求路徑:/索引庫名
- 請求參數(shù):無
格式:
GET /索引庫名示例:
2.2.3.修改索引庫
注意:倒排索引中數(shù)據(jù)結(jié)構(gòu)發(fā)生改變(比如改變分詞器),此時需重新創(chuàng)建倒排索引,因此索引庫一旦創(chuàng)建,無法修改mapping已有字段。
- 雖然無法修改mapping中已有字段,但允許添加新字段到mapping,不會對倒排索引產(chǎn)生影響。
- 因此需要修改索引庫時,需要先刪除后添加新索引庫。
語法說明:
PUT /索引庫名/_mapping {"properties": {"新字段名":{"type": "integer"}} }示例:
2.2.4.刪除索引庫
語法:
- 請求方式:DELETE
- 請求路徑:/索引庫名
- 請求參數(shù):無
格式:
DELETE /索引庫名3.文檔操作
3.1.新增文檔
語法:
POST /索引庫名/_doc/文檔id {"字段1": "值1","字段2": "值2","字段3": {"子屬性1": "值3","子屬性2": "值4"},// ... }示例:
POST /heima/_doc/1 {"info": "張三學(xué)生","email": "zs@qq.cn","name": {"firstName": "三","lastName": "張"} }3.2.查詢文檔
語法:
GET /{索引庫名稱}/_doc/{id}示例:
GET /person/_doc/13.3.刪除文檔
語法:
DELETE /{索引庫名}/_doc/id值示例:
DELETE /person/_doc/13.4.修改文檔
| 增量修改 | 修改文檔中的部分字段 |
3.4.1.全量修改
全量修改:覆蓋原來的文檔,本質(zhì)是:
- 根據(jù)指定的id刪除文檔
- 新增一個相同id的文檔
注意:如果根據(jù)id刪除,當(dāng)id不存在,第二步新增也會執(zhí)行,也就是從修改操作變成新增操作。
語法:
PUT /{索引庫名}/_doc/文檔id {"字段1": "值1","字段2": "值2",// ... 略 }示例:
PUT /heima/_doc/1 {"info": "學(xué)生信息","email": "zy2@itcast.cn","name": {"firstName": "云","lastName": "趙"} }3.4.2.增量修改
增量修改:只修改指定id匹配到對應(yīng)文檔中的字段。
語法:
POST /{索引庫名}/_update/文檔id {"doc": {"字段名": "新的值",} }示例:
POST /heima/_update/1 {"doc": {"email": "ZhaoYun@itcast.cn"} }4.RestAPI
ES官方提供了各種不同語言的客戶端,用來操作ES。這些客戶端的本質(zhì)就是組裝DSL語句,通過http請求發(fā)送給ES。官方文檔地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html
本篇使用:Java HighLevel Rest Client客戶端API
4.1 根據(jù)MySQL數(shù)據(jù)庫書寫DSL
4.1.1 數(shù)據(jù)庫表結(jié)構(gòu)
CREATE TABLE `tb_hotel` (`id` bigint(20) NOT NULL COMMENT '酒店id',`name` varchar(255) NOT NULL COMMENT '酒店名稱;例:7天酒店',`address` varchar(255) NOT NULL COMMENT '酒店地址;例:航頭路',`price` int(10) NOT NULL COMMENT '酒店價格;例:329',`score` int(2) NOT NULL COMMENT '酒店評分;例:45,就是4.5分',`brand` varchar(32) NOT NULL COMMENT '酒店品牌;例:如家',`city` varchar(32) NOT NULL COMMENT '所在城市;例:上海',`star_name` varchar(16) DEFAULT NULL COMMENT '酒店星級,從低到高分別是:1星到5星,1鉆到5鉆',`business` varchar(255) DEFAULT NULL COMMENT '商圈;例:虹橋',`latitude` varchar(32) NOT NULL COMMENT '緯度;例:31.2497',`longitude` varchar(32) NOT NULL COMMENT '經(jīng)度;例:120.3925',`pic` varchar(255) DEFAULT NULL COMMENT '酒店圖片;例:/img/1.jpg',PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;4.1.2 ES的DSL
PUT /hotel {"mappings": {"properties": {"id":{"type": "long"},"name":{"type": "text","analyzer": "ik_smart","copy_to": "all"},"address":{"type": "keyword", "index": false},"price":{"type": "integer"},"score":{"type": "integer"},"brand":{"type": "keyword","copy_to": "all"},"city":{"type": "keyword","index": true,"copy_to": "all"},"starName":{"type": "keyword"},"business":{"type": "text","analyzer": "ik_smart"},"location":{"type": "geo_point"},"all":{"type": "text", "analyzer": "ik_smart"},"pic":{"type": "keyword","index": false}}} }4.2 SpringBoot使用Java HighLevel Rest Client API
4.2.1 查看SpringBoot默認(rèn)的ES版本是7.6.2
4.2.2 maven引入API坐標(biāo)
<!--引入es的RestHighLevelClient依賴--> <dependency> <groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency><!--SpringBoot默認(rèn)的ES版本是7.6.2,所以我們需要覆蓋默認(rèn)的ES版本--> <properties><java.version>1.8</java.version> <elasticsearch.version>7.12.1</elasticsearch.version> </properties>4.2.3 yml添加配置
spring:elasticsearch:rest:uris: http://192.168.180.135:92004.2.4 ES中9200與9300端口說明
| 9200 | ES節(jié)點(diǎn)與外部通訊端口。它是http協(xié)議的RESTful接口(各種CRUD操作都是通過端口,如查詢:http://localhost:9200/user/_search)。 |
| 9300 | ES節(jié)點(diǎn)間通訊使用端口。它是tcp通訊端口,集群間和TCPclient都通過此端口。 |
4.3 創(chuàng)建索引庫
4.3.1 封裝DSL常量類
//Constants.java public class Constants {public static final String MAPPING ="{\n" +" \"properties\": {\n" +" \"id\":{\n" +" \"type\": \"long\"\n" +" },\n" +" \"name\":{\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_smart\",\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"address\":{\n" +" \"type\": \"keyword\", \n" +" \"index\": false\n" +" },\n" +" \"price\":{\n" +" \"type\": \"integer\"\n" +" },\n" +" \"score\":{\n" +" \"type\": \"integer\"\n" +" },\n" +" \"brand\":{\n" +" \"type\": \"keyword\",\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"city\":{\n" +" \"type\": \"keyword\",\n" +" \"index\": true,\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"starName\":{\n" +" \"type\": \"keyword\"\n" +" },\n" +" \"business\":{\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_smart\"\n" +" },\n" +" \"location\":{\n" +" \"type\": \"geo_point\"\n" +" },\n" +" \"all\":{\n" +" \"type\": \"text\"\n" +" , \"analyzer\": \"ik_smart\"\n" +" },\n" +" \"pic\":{\n" +" \"type\": \"keyword\",\n" +" \"index\": false\n" +" }\n" +" }\n" +" }"; }4.3.2 測試類——創(chuàng)建索引庫
@Testpublic void testCreateIndex() throws Exception {//目標(biāo):向es服務(wù)器發(fā)送請求,創(chuàng)建索引// 1.創(chuàng)建request對象,創(chuàng)建——>createCreateIndexRequest createIndexRequest = new CreateIndexRequest("hetol");// 2.準(zhǔn)備請求參數(shù):DSL語句// 2.1 Constants.MAPPING是我們定義的常量類// 2.2 XContentType.JSON是由于創(chuàng)建索引時是JSON格式createIndexRequest.mapping(Constants.MAPPING, XContentType.JSON);// 3.通過ES客戶端向ES服務(wù)器通信// 3.1 RequestOptions:請求方式(同步/異步),默認(rèn)是同步CreateIndexResponse response = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);System.out.println(response.isAcknowledged());}4.3.3 RequestOptions:請求方式(同步/異步)探究
移步專題:微風(fēng)·六:RequestOptions:請求方式(同步/異步)探究
總結(jié)
以上是生活随笔為你收集整理的Elasticsearch+Kibana·入门·壹的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 生成一个二维码
- 下一篇: 取千位,百位,十位,个位