日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Elasticsearch+Kibana·入门·壹

發(fā)布時間:2024/1/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Elasticsearch+Kibana·入门·壹 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 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)

正向索引:

優(yōu)點(diǎn)缺點(diǎn)
可以給多個字段創(chuàng)建索引根據(jù)非索引字段,或者索引字段中的部分詞條查找時,只能全表掃描。
根據(jù)索引字段搜索、排序速度非常快

倒排索引:

優(yōu)點(diǎn)缺點(diǎn)
根據(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對比

MySQLElasticsearch說明
TableIndex索引(index),就是文檔的集合,類似數(shù)據(jù)庫的表(table),而MySQL中索引時從0開始的下標(biāo)
RowDocument文檔(Document),就是一條條的數(shù)據(jù),類似數(shù)據(jù)庫中的行(Row),文檔都是JSON格式
ColumnField字段/詞條(Field),就是JSON文檔中的字段,類似數(shù)據(jù)庫中的列(Column)
SchemaMappingMapping(映射)是索引中文檔的約束,例如字段類型約束。類似數(shù)據(jù)庫的表結(jié)構(gòu)(Schema)
SQLDSLDSL是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/1

3.3.刪除文檔

語法:

DELETE /{索引庫名}/_doc/id值

示例:

DELETE /person/_doc/1

3.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:9200

4.2.4 ES中9200與9300端口說明

端口說明
9200ES節(jié)點(diǎn)與外部通訊端口。它是http協(xié)議的RESTful接口(各種CRUD操作都是通過端口,如查詢:http://localhost:9200/user/_search)。
9300ES節(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。