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