國外獨(dú)立站建站站長工具seo綜合查詢推廣
文章目錄
- 初識(shí) elasticsearch
- 了解 ES
- 倒排索引
- ES 的一些概念
- 安裝es、kibana
- 安裝elasticsearch
- 部署kibana
- 分詞器
- 安裝IK分詞器
- ik分詞器-拓展詞庫
- 索引庫操作
- mapping 映射屬性
- 索引庫的 CRUD
- 文檔操作
- 添加文檔
- 查看、刪除文檔
- 修改文檔
- Dynamic Mapping
- RestClient 操作索引庫
- 什么是RestClient
- 創(chuàng)建索引庫
- 刪除索引庫
- 判斷索引庫是否存在
- RestClient操作文檔
- 新增文檔
- 查詢文檔
- 修改文檔
- 刪除文檔
- 批量導(dǎo)入文檔
初識(shí) elasticsearch
了解 ES
Elasticsearch 是一款非常強(qiáng)大的開源搜索引擎,可以幫助我們從海量數(shù)據(jù)中快速找到需要的內(nèi)容。
elasticsearch 結(jié)合 kibana、Logstash、Beats,也就是 elastic stack(ELK)。被廣泛應(yīng)用在日志數(shù)據(jù)分析、實(shí)時(shí)監(jiān)控等領(lǐng)域。
elasticsearch 是 elastic stack 的核心,負(fù)責(zé)存儲(chǔ)、搜索、分析數(shù)據(jù)。
Lucene是一個(gè)Java語言的搜索引擎類庫,是Apache公司的頂級(jí)項(xiàng)目,由DougCutting于1999年研發(fā)。官網(wǎng)地址:https://lucene.apache.org/ 。
Lucene的優(yōu)勢:
- 易擴(kuò)展
- 高性能(基于倒排索引)
Lucene的缺點(diǎn):
- 只限于Java語言開發(fā)
- 學(xué)習(xí)曲線陡峭
- 不支持水平擴(kuò)展
2004年Shay Banon基于Lucene開發(fā)了Compass
2010年Shay Banon 重寫了Compass,取名為Elasticsearch。
官網(wǎng)地址: https://www.elastic.co/cn/
目前最新的版本是:7.12.1
相比與lucene,elasticsearch具備下列優(yōu)勢:
- 支持分布式,可水平擴(kuò)展
- 提供Restful接口,可被任何語言調(diào)用
搜索引擎技術(shù)排名:
- Elasticsearch:開源的分布式搜索引擎
- Splunk:商業(yè)項(xiàng)目
- Solr:Apache的開源搜索引擎
什么是 elasticsearch?
- 一個(gè)開源的分布式搜索引擎,可以用來實(shí)現(xiàn)搜索、日志統(tǒng)計(jì)、分析、系統(tǒng)監(jiān)控等功能
什么是 elastic stack(ELK)?
- 是以elasticsearch為核心的技術(shù)棧,包括beats、Logstash、kibana、elasticsearch
什么是 Lucene?
- 是Apache的開源搜索引擎類庫,提供了搜索引擎的核心API
倒排索引
傳統(tǒng)數(shù)據(jù)庫(如MySQL)采用正向索引,例如給下表(tb_goods)中的id創(chuàng)建索引:
正向索引和倒排索引
elasticsearch采用倒排索引:
- 文檔(document):每條數(shù)據(jù)就是一個(gè)文檔
- 詞條(term):文檔按照語義分成的詞語
posting list
倒排索引中包含兩部分內(nèi)容:
- 詞條詞典(Term Dictionary):記錄所有詞條,以及詞條與倒排列表(Posting List)之間的關(guān)系,會(huì)給詞條創(chuàng)建索引,提高查詢和插入效率
- 倒排列表(Posting List):記錄詞條所在的文檔id、詞條出現(xiàn)頻率 、詞條在文檔中的位置等信息
- 文檔id:用于快速獲取文檔
- 詞條頻率(TF):文檔在詞條出現(xiàn)的次數(shù),用于評(píng)分
什么是文檔和詞條?
- 每一條數(shù)據(jù)就是一個(gè)文檔
- 對(duì)文檔中的內(nèi)容分詞,得到的詞語就是詞條
什么是正向索引?
- 基于文檔id創(chuàng)建索引。查詢詞條時(shí)必須先找到文檔,而后判斷是否包含詞條
什么是倒排索引?
- 對(duì)文檔內(nèi)容分詞,對(duì)詞條創(chuàng)建索引,并記錄詞條所在文檔的信息。查詢時(shí)先根據(jù)詞條查詢到文檔id,而后獲取到文檔
ES 的一些概念
文檔
elasticsearch是面向文檔存儲(chǔ)的,可以是數(shù)據(jù)庫中的一條商品數(shù)據(jù),一個(gè)訂單信息。
文檔數(shù)據(jù)會(huì)被序列化為json格式后存儲(chǔ)在elasticsearch中。
索引(index):相同類型的文檔的集合
映射(mapping):索引中文檔的字段約束信息,類似表的結(jié)構(gòu)約束
概念對(duì)比
架構(gòu)
Mysql:擅長事務(wù)類型操作,可以確保數(shù)據(jù)的安全和一致性
Elasticsearch:擅長海量數(shù)據(jù)的搜索、分析、計(jì)算
文檔:一條數(shù)據(jù)就是一個(gè)文檔,es中是Json格式
字段:Json文檔中的字段
索引:同類型文檔的集合
映射:索引中文檔的約束,比如字段名稱、類型
elasticsearch與數(shù)據(jù)庫的關(guān)系:
- 數(shù)據(jù)庫負(fù)責(zé)事務(wù)類型操作
- elasticsearch 負(fù)責(zé)海量數(shù)據(jù)的搜索、分析、計(jì)算
安裝es、kibana
安裝elasticsearch
部署單點(diǎn)es
因?yàn)槲覀冞€需要部署kibana容器,因此需要讓es和kibana容器互聯(lián)。這里先創(chuàng)建一個(gè)網(wǎng)絡(luò):
docker network create es-net
加載鏡像
通過 docker pull
命令拉取
elasticsearch
docker pull elasticsearch:7.16.2
arm linux
docker pull arm64v8/elasticsearch:7.16.2
kibana
docker pull kibana:7.16.2
運(yùn)行
運(yùn)行docker命令,部署單點(diǎ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.16.2
命令解釋:
-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)存大小-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
:端口映射配置
在瀏覽器中輸入:http://10.211.55.6:9200
即可看到elasticsearch的響應(yīng)結(jié)果:
部署kibana
kibana可以給我們提供一個(gè)elasticsearch的可視化界面,便于我們學(xué)習(xí)。
- 部署
運(yùn)行docker命令,部署kibana
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601 \
kibana:7.16.2
--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
:端口映射配置
kibana啟動(dòng)一般比較慢,需要多等待一會(huì),可以通過命令:
docker logs -f kibana
查看運(yùn)行日志,當(dāng)查看到下面的日志,說明成功:
此時(shí),在瀏覽器輸入地址訪問:http://10.211.55.6:5601
,即可看到結(jié)果
- DevTools
kibana 中提供了一個(gè)DevTools界面:
這個(gè)界面中可以編寫DSL來操作elasticsearch。并且對(duì)DSL語句有自動(dòng)補(bǔ)全功能。
分詞器
es在創(chuàng)建倒排索引時(shí)需要對(duì)文檔分詞;在搜索時(shí),需要對(duì)用戶輸入內(nèi)容分詞。但默認(rèn)的分詞規(guī)則對(duì)中文處理并不友好。
我們在kibana的DevTools中測試:
POST /_analyze
{"text": "java學(xué)習(xí)中,勿擾?程序員", "analyzer": "standard"
}
語法說明:
- POST:請(qǐng)求方式
- /_analyze:請(qǐng)求路徑,這里省略了http://10.211.55.6/:9200,有kibana幫我們補(bǔ)充
- 請(qǐng)求參數(shù),json風(fēng)格:
- analyzer:分詞器類型,這里是默認(rèn)的standard分詞器
- text:要分詞的內(nèi)容
安裝IK分詞器
處理中文分詞,一般會(huì)使用IK分詞器。https://github.com/medcl/elasticsearch-analysis-ik
在線安裝ik插件
# 進(jìn)入容器內(nèi)部
docker exec -it elasticsearch /bin/bash# 在線下載并安裝
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip#退出
exit
#重啟容器
docker restart elasticsearch
離線安裝ik插件
1)查看數(shù)據(jù)卷目錄
安裝插件需要知道 elasticsearch 的 plugins 目錄位置,而我們用了數(shù)據(jù)卷掛載,因此需要查看 elasticsearch 的數(shù)據(jù)卷目錄,通過下面命令查看:
docker volume inspect es-plugins
顯示結(jié)果:
[{"CreatedAt": "2023-11-17T15:52:19+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/es-plugins/_data","Name": "es-plugins","Options": null,"Scope": "local"}
]
說明plugins目錄被掛載到了:/var/lib/docker/volumes/es-plugins/_data
這個(gè)目錄中。
2)解壓縮分詞器安裝包
把ik分詞器解壓縮,重命名為ik
3)上傳到es容器的插件數(shù)據(jù)卷中
也就是/var/lib/docker/volumes/es-plugins/_data
4)重啟容器
# 4、重啟容器
docker restart es
# 查看es日志
docker logs -f es
5)測試
IK分詞器包含兩種模式:
-
ik_smart
:最少切分 -
ik_max_word
:最細(xì)切分
POST /_analyze
{"text": "java學(xué)習(xí)中,勿擾?程序員", "analyzer": "ik_max_word"
}
結(jié)果
{"tokens" : [{"token" : "java","start_offset" : 0,"end_offset" : 4,"type" : "ENGLISH","position" : 0},{"token" : "學(xué)習(xí)","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 1},{"token" : "中","start_offset" : 6,"end_offset" : 7,"type" : "CN_CHAR","position" : 2},{"token" : "勿擾","start_offset" : 8,"end_offset" : 10,"type" : "CN_WORD","position" : 3},{"token" : "程序員","start_offset" : 11,"end_offset" : 14,"type" : "CN_WORD","position" : 4},{"token" : "程序","start_offset" : 11,"end_offset" : 13,"type" : "CN_WORD","position" : 5},{"token" : "員","start_offset" : 13,"end_offset" : 14,"type" : "CN_CHAR","position" : 6}]
}
ik分詞器-拓展詞庫
要拓展ik分詞器的詞庫,只需要修改一個(gè)ik分詞器目錄中的 config
目錄中的IkAnalyzer.cfg.xml
文件:
然后在名為 ext.dic
的文件中,添加想要拓展的詞語即可:
要禁用某些敏感詞條,只需要修改一個(gè)ik分詞器 目錄中的 config
目錄中的IkAnalyzer.cfg.xml
文件:
然后在名為 stopword.dic
的文件中,添加想要拓展的詞語即可:
分詞器的作用是什么?
- 創(chuàng)建倒排索引時(shí)對(duì)文檔分詞
- 用戶搜索時(shí),對(duì)輸入的內(nèi)容分詞
IK分詞器有幾種模式?
- ik_smart:智能切分,粗粒度
- ik_max_word:最細(xì)切分,細(xì)粒度
IK分詞器如何拓展詞條?如何停用詞條?
- 利用config目錄的IkAnalyzer.cfg.xml文件添加拓展詞典和停用詞典
- 在詞典中添加拓展詞條或者停用詞條
索引庫操作
mapping 映射屬性
mapping是對(duì)索引庫中文檔的約束,常見的mapping屬性包括:
- type:字段數(shù)據(jù)類型,常見的簡單類型有:
- 字符串:text(可分詞的文本)、keyword(精確值,例如:品牌、國家、ip地址)
- 數(shù)值:long、integer、short、byte、double、float、
- 布爾:boolean
- 日期:date
- 對(duì)象:object
- index:是否創(chuàng)建索引,默認(rèn)為true
- analyzer:使用哪種分詞器
- properties:該字段的子字段
mapping常見屬性有哪些?
- type:數(shù)據(jù)類型
- index:是否索引
- analyzer:分詞器
- properties:子字段
type常見的有哪些?
- 字符串:text、keyword
- 數(shù)字:long、integer、short、byte、double、float
- 布爾:boolean
- 日期:date
- 對(duì)象:object
索引庫的 CRUD
ES中通過Restful請(qǐng)求操作索引庫、文檔。請(qǐng)求內(nèi)容用DSL語句來表示。創(chuàng)建索引庫和mapping的DSL語法如下:
# 創(chuàng)建索引庫
PUT /wxx
{"mappings": {"properties": {"info": {"type": "text","analyzer": "ik_smart"},"email": {"type": "keyword","index": false},"name": {"type": "object","properties": {"firstName": {"type": "keyword"},"lastName": {"type": "keyword"}}}}}
}
查看索引庫語法:
GET /索引庫名
示例:
GET /wxx
刪除索引庫的語法:
DELETE /索引庫名
示例:
DELETE /wxx
修改索引庫
索引庫和mapping一旦創(chuàng)建無法修改,但是可以添加新的字段,語法如下:
PUT /索引庫名/_mapping
{"properties": {"新字段名":{"type": "integer"}}
}
示例:
PUT /wxx/_mapping
{"properties": {"age":{"type": "integer"}}
}
索引庫操作有哪些?
- 創(chuàng)建索引庫:PUT /索引庫名
- 查詢索引庫:GET /索引庫名
- 刪除索引庫:DELETE /索引庫名
- 添加字段:PUT /索引庫名/_mapping
文檔操作
添加文檔
新增文檔的 DSL 語法如下:
查看、刪除文檔
查看文檔語法:
GET /索引庫名/_doc/文檔id
示例:
GET /wxx/_doc/文檔id
刪除索引庫的語法:
DELETE /索引庫名/_doc/文檔id
示例:
DELETE /wxx/_doc/文檔id
修改文檔
方式一:全量修改,會(huì)刪除舊文檔,添加新文檔
方式二:增量修改,修改指定字段值
文檔操作有哪些?
- 創(chuàng)建文檔:POST /索引庫名/_doc/文檔id { json文檔 }
- 查詢文檔:GET /索引庫名/_doc/文檔id
- 刪除文檔:DELETE /索引庫名/_doc/文檔id
- 修改文檔:
- 全量修改:PUT /索引庫名/_doc/文檔id { json文檔 }
- 增量修改:POST /索引庫名/_update/文檔id { “doc”: {字段}}
Dynamic Mapping
當(dāng)我們向ES中插入文檔時(shí),如果文檔中字段沒有對(duì)應(yīng)的mapping,ES會(huì)幫助我們字段設(shè)置mapping,規(guī)則如下:
我們插入一條新的數(shù)據(jù),其中包含4個(gè)沒有mapping的字段:
- 插入文檔時(shí),es會(huì)檢查文檔中的字段是否有mapping,如果沒有則按照默認(rèn)mapping規(guī)則來創(chuàng)建索引。
- 如果默認(rèn)mapping規(guī)則不符合你的需求,一定要自己設(shè)置字段mapping
RestClient 操作索引庫
什么是RestClient
ES官方提供了各種不同語言的客戶端,用來操作ES。這些客戶端的本質(zhì)就是組裝DSL語句,通過http請(qǐng)求發(fā)送給ES。官方文檔地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html
利用JavaRestClient實(shí)現(xiàn)創(chuàng)建、刪除索引庫,判斷索引庫是否存在
根據(jù)課前資料提供的酒店數(shù)據(jù)創(chuàng)建索引庫,索引庫名為hotel,mapping屬性根據(jù)數(shù)據(jù)庫結(jié)構(gòu)定義。
基本步驟如下:
- 導(dǎo)入課前資料Demo
- 分析數(shù)據(jù)結(jié)構(gòu),定義mapping屬性
- 初始化JavaRestClient
- 利用JavaRestClient創(chuàng)建索引庫
- 利用JavaRestClient刪除索引庫
- 利用JavaRestClient判斷索引庫是否存在
DROP TABLE IF EXISTS `tb_hotel`;
CREATE TABLE `tb_hotel` (`id` bigint(20) NOT NULL COMMENT '酒店id',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店名稱',`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店地址',`price` int(10) NOT NULL COMMENT '酒店價(jià)格',`score` int(2) NOT NULL COMMENT '酒店評(píng)分',`brand` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店品牌',`city` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '所在城市',`star_name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '酒店星級(jí),1星到5星,1鉆到5鉆',`business` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商圈',`latitude` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '緯度',`longitude` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '經(jīng)度',`pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '酒店圖片',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
步驟1:導(dǎo)入課前資料Demo
首先導(dǎo)入課前資料提供的數(shù)據(jù)庫數(shù)據(jù):
然后導(dǎo)入課前資料提供的項(xiàng)目:
步驟2:分析數(shù)據(jù)結(jié)構(gòu)
mapping要考慮的問題:
字段名、數(shù)據(jù)類型、是否參與搜索、是否分詞、如果分詞,分詞器是什么?
ES中支持兩種地理坐標(biāo)數(shù)據(jù)類型:
- geo_point:由緯度(latitude)和經(jīng)度(longitude)確定的一個(gè)點(diǎn)。例如:“32.8752345, 120.2981576”
- geo_shape:有多個(gè)geo_point組成的復(fù)雜幾何圖形。例如一條直線,“LINESTRING (-77.03653 38.897676, -77.009051 38.889939)”
字段拷貝可以使用copy_to屬性將當(dāng)前字段拷貝到指定字段。示例:
步驟3:初始化JavaRestClient
- 引入es的RestHighLevelClient依賴:
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
- 因?yàn)镾pringBoot默認(rèn)的ES版本是7.6.2,所以我們需要覆蓋默認(rèn)的ES版本:
<properties><java.version>1.8</java.version><elasticsearch.version>7.16.2</elasticsearch.version>
</properties>
- 初始化RestHighLevelClient:
this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://10.211.55.6:9200")
));
創(chuàng)建索引庫
步驟4:創(chuàng)建索引庫
@Test
void testCreateHotelIndex() throws IOException {// 1. 創(chuàng)建Request對(duì)象CreateIndexRequest request = new CreateIndexRequest("hotel");// 2. 準(zhǔn)備請(qǐng)求參數(shù):DSL語句request.source(HotelConstants.MAPPING_TEMPLATE, XContentType.JSON);// 3. 發(fā)送請(qǐng)求client.indices().create(request, RequestOptions.DEFAULT);
}
# 酒店的mapping
PUT /hotel
{"mappings": {"properties": {"all": {"type": "text","analyzer": "ik_max_word"},"id": {"type": "keyword"},"name": {"type": "text","analyzer": "ik_max_word","copy_to": "all"},"address": {"type": "keyword","index": false},"price": {"type": "integer"},"score": {"type": "integer"},"brand": {"type": "keyword","copy_to": "all"},"city": {"type": "keyword"},"starName": {"type": "keyword"},"business": {"type": "keyword","copy_to": "all"},"location": {"type": "geo_point"},"pic": {"type": "keyword","index": false}}}
}
刪除索引庫
步驟5:刪除索引庫、判斷索引庫是否存在
刪除索引庫代碼如下:
判斷索引庫是否存在
判斷索引庫是否存在
索引庫操作的基本步驟:
- 初始化RestHighLevelClient
- 創(chuàng)建XxxIndexRequest。XXX是Create、Get、Delete
- 準(zhǔn)備DSL( Create時(shí)需要)
- 發(fā)送請(qǐng)求。調(diào)用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete
RestClient操作文檔
利用JavaRestClient實(shí)現(xiàn)文檔的CRUD
去數(shù)據(jù)庫查詢酒店數(shù)據(jù),導(dǎo)入到hotel索引庫,實(shí)現(xiàn)酒店數(shù)據(jù)的CRUD。
基本步驟如下:
- 初始化JavaRestClient
- 利用JavaRestClient新增酒店數(shù)據(jù)
- 利用JavaRestClient根據(jù)id查詢酒店數(shù)據(jù)
- 利用JavaRestClient刪除酒店數(shù)據(jù)
- 利用JavaRestClient修改酒店數(shù)據(jù)
新增文檔
步驟1:初始化JavaRestClient
新建一個(gè)測試類,實(shí)現(xiàn)文檔相關(guān)操作,并且完成JavaRestClient的初始化
步驟2:添加酒店數(shù)據(jù)到索引庫
先查詢酒店數(shù)據(jù),然后給這條數(shù)據(jù)創(chuàng)建倒排索引,即可完成添加:
@SpringBootTest
public class HotelDocumentTest {@Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;@Testvoid testInit(){System.out.println(client);}@Testvoid testAddDocument() throws IOException {// 根據(jù) id 查詢酒店數(shù)據(jù)Hotel hotel = hotelService.getById(38665L);// 轉(zhuǎn)換為文檔類型HotelDoc hotelDoc = new HotelDoc(hotel);// 1. 準(zhǔn)備Request對(duì)象IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());// 2. 準(zhǔn)備Json文檔request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);// 3. 發(fā)送請(qǐng)求client.index(request, RequestOptions.DEFAULT);}@BeforeEachvoid setUp(){this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://10.211.55.6:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}
運(yùn)行后查看是否添加成功
查詢文檔
步驟3:根據(jù)id查詢酒店數(shù)據(jù)
根據(jù)id查詢到的文檔數(shù)據(jù)是json,需要反序列化為java對(duì)象:
修改文檔
步驟4:根據(jù)id修改酒店數(shù)據(jù)
修改文檔數(shù)據(jù)有兩種方式:
方式一:全量更新。再次寫入id一樣的文檔,就會(huì)刪除舊文檔,添加新文檔
方式二:局部更新。只更新部分字段,我們演示方式二
刪除文檔
步驟5:根據(jù)id刪除文檔數(shù)據(jù)
刪除文檔代碼如下:
文檔操作的基本步驟:
- 初始化RestHighLevelClient
- 創(chuàng)建XxxRequest。XXX是Index、Get、Update、Delete
- 準(zhǔn)備參數(shù)(Index和Update時(shí)需要)
- 發(fā)送請(qǐng)求。調(diào)用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete
- 解析結(jié)果(Get時(shí)需要)
批量導(dǎo)入文檔
利用JavaRestClient批量導(dǎo)入酒店數(shù)據(jù)到ES
需求:批量查詢酒店數(shù)據(jù),然后批量導(dǎo)入索引庫中
思路:
- 利用mybatis-plus查詢酒店數(shù)據(jù)
- 將查詢到的酒店數(shù)據(jù)(Hotel)轉(zhuǎn)換為文檔類型數(shù)據(jù)(HotelDoc)
- 利用JavaRestClient中的Bulk批處理,實(shí)現(xiàn)批量新增文檔,示例代碼如下
@Testvoid testBulkRequest() throws IOException {// 批量查詢酒店數(shù)據(jù)List<Hotel> hotels = hotelService.list();// 1. 創(chuàng)建 RequestBulkRequest request = new BulkRequest();// 2. 準(zhǔn)備參數(shù),添加多個(gè)新增的Requestfor (Hotel hotel : hotels) {// 轉(zhuǎn)換為文檔類型 HotelDocHotelDoc hotelDoc = new HotelDoc(hotel);// 創(chuàng)建新增文檔的Request對(duì)象request.add(new IndexRequest("hotel").id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc), XContentType.JSON));}// 3. 發(fā)送請(qǐng)求client.bulk(request, RequestOptions.DEFAULT);}