簡(jiǎn)介
Elasticsearch 是 Elastic Stack 核心的分布式搜索和分析引擎。 Logstash 和 Beats 有助于收集、聚合和豐富您的數(shù)據(jù)并將其存儲(chǔ)在 Elasticsearch 中。 Kibana 使您能夠以交互方式探索、可視化和分享對(duì)數(shù)據(jù)的見解,并管理和監(jiān)控堆棧。 Elasticsearch 可以快速索引、搜索和分析海量數(shù)據(jù)。
Elastic 的底層是開源庫 Lucene。但是,你沒法直接用 Lucene,必須自己寫代碼去調(diào)用它的接口。Elastic 是 Lucene 的封裝,提供了 REST API 的操作接口,開箱即用。
官方文檔(推薦):官方文檔鏈接
官方中文:官方中文文檔鏈接
社區(qū)中文:xiaoleilu.com、codingdict.com
一、基本概念
1、Index(索引)
動(dòng)詞:相當(dāng)于 MySQL 中的 insert;
名詞:相當(dāng)于 MySQL 中的 Database。
2、Type(類型)
在 Index(索引)中,可以定義一個(gè)或多個(gè)類型。類似于 MySQL 中的 Table,同種類型的數(shù)據(jù)放在一起。
3、Document(文檔)
保存在某個(gè)索引(Index)下,某種類型(Type)的一個(gè)數(shù)據(jù)(Document),文檔是 JSON 格式的,Document 就像是 MySQL 中的某個(gè) Table 里面的內(nèi)容。
二、Docker 安裝 Es
1、下載鏡像文件
docker pull elasticsearch:8.12
:存儲(chǔ)和檢索數(shù)據(jù)docker pull kibana:8.12
:可視化檢索數(shù)據(jù)
2、創(chuàng)建實(shí)例
1.ElasticSearch
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
chmod -R 777 /mydata/elasticsearch/ #保證權(quán)限
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \ #設(shè)置初始內(nèi)存和占用最大內(nèi)存
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:8.12
2.Kibana
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://xxx:9200 -p 5601:5601 \
-d kibana:8.12
#xxx為自己的虛擬機(jī)地址
三、初步檢索
1、_cat
GET /_cat/nodes:查看所有節(jié)點(diǎn)
GET /_cat/health:查看 es 健康狀況
GET /_cat/master:查看主節(jié)點(diǎn)
GET /_cat/indices:查看所有索引 show databases
2、索引一個(gè)文檔(保存)
在 customer 索引下的 external 類型下保存 1 號(hào)數(shù)據(jù)為:
POST customer/external/1
{
"name": "John Doe"
}
#PUT 和 POST 都可以,
#POST 新增。如果不指定 id,會(huì)自動(dòng)生成 id。指定 id 就會(huì)修改這個(gè)數(shù)據(jù),并新增版本號(hào)
#PUT 可以新增可以修改。PUT 必須指定 id;由于 PUT 需要指定 id,我們一般都用來做修改
#操作,不指定 id 會(huì)報(bào)錯(cuò)。
3、查詢文檔
GET customer/external/1
結(jié)果:
{
"_index": "customer", //在哪個(gè)索引
"_type": "external", //在哪個(gè)類型
"_id": "1", //記錄 id
"_version": 2, //版本號(hào)
"_seq_no": 1, //并發(fā)控制字段,每次更新就會(huì)+1,用來做樂觀鎖
"_primary_term": 1, //同上,主分片重新分配,如重啟,就會(huì)變化
"found": true, "_source": { //真正的內(nèi)容
"name": "John Doe"
}
}
4、更新文檔
POST customer/external/1/_update
{
"doc":{
"name": "John Doew"
}
}
或者
POST customer/external/1
{
"name": "John Doe2"
}
或者
PUT customer/external/1
{
"name": "John Doe"
}
不同:POST 操作會(huì)對(duì)比源文檔數(shù)據(jù),如果相同不會(huì)有什么操作,文檔 version 不增加PUT 操作總會(huì)將數(shù)據(jù)重新保存并增加 version 版本;帶_update 對(duì)比元數(shù)據(jù)如果一樣就不進(jìn)行任何操作。
看場(chǎng)景:
對(duì)于大并發(fā)更新,不帶 _update;
對(duì)于大并發(fā)查詢偶爾更新,帶 _update;對(duì)比更新,重新計(jì)算分配規(guī)則。
5、刪除文檔&索引
DELETE customer/external/1
DELETE customer
6、bulk 批量 API
POST customer/external/_bulk
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
#語法格式:
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
四、進(jìn)階索引
1、SearchAPI
ES 支持兩種基本方式檢索 :
- 一個(gè)是通過使用 REST request URI 發(fā)送搜索參數(shù)(uri+檢索參數(shù))
- 另一個(gè)是通過使用 REST request body 來發(fā)送它們(uri+請(qǐng)求體)
檢索信息
- 請(qǐng)求參數(shù)方式檢索
GET bank/_search?q=*&sort=account_number:asc
#響應(yīng)結(jié)果解釋:
took - Elasticsearch 執(zhí)行搜索的時(shí)間(毫秒)
time_out - 告訴我們搜索是否超時(shí)
_shards - 告訴我們多少個(gè)分片被搜索了,以及統(tǒng)計(jì)了成功/失敗的搜索分片
hits - 搜索結(jié)果
hits.total - 搜索結(jié)果
hits.hits - 實(shí)際的搜索結(jié)果數(shù)組(默認(rèn)為前 10 的文檔)
sort - 結(jié)果的排序 key(鍵)(沒有則按 score 排序)
score 和 max_score –相關(guān)性得分和最高得分(全文檢索用)
- uri+請(qǐng)求體進(jìn)行檢索
GET bank/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"account_number": {
"order": "desc"
}
}
]
}
2、Query DSL
(1) 基本語法格式
Elasticsearch 提供了一個(gè)可以執(zhí)行查詢的 Json 風(fēng)格的 DSL(domain-specific language 領(lǐng)域特定語言)。這個(gè)被稱為 Query DSL。該查詢語言非常全面,并且剛開始的時(shí)候感覺有點(diǎn)復(fù)雜,真正學(xué)好它的方法是從一些基礎(chǔ)的示例開始的。
- 一個(gè)查詢語句 的典型結(jié)構(gòu):
{
QUERY_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
- 如果是針對(duì)某個(gè)字段,那么它的結(jié)構(gòu)如下:
{
QUERY_NAME: {
FIELD_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}
比如:
GET bank/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 5,
"sort": [
{
"account_number": {
"order": "desc"
}
}
]
}
其中:
- query 定義如何查詢,
- match_all 查詢類型【代表查詢所有的所有】,es 中可以在 query 中組合非常多的查詢類型完成復(fù)雜查詢
- 除了 query 參數(shù)之外,我們也可以傳遞其它的參數(shù)以改變查詢結(jié)果。如 sort,size
- from+size 限定,完成分頁功能
- sort 排序,多字段排序,會(huì)在前序字段相等時(shí)后續(xù)字段內(nèi)部排序,否則以前序?yàn)闇?zhǔn)
其他常用的語法比如:
match【匹配查詢】
match_phrase【短語匹配】
multi_match【多字段匹配】
bool【復(fù)合查詢】
filter【結(jié)果過濾】
term【全文檢索字段用 match,其他非 text 字段匹配用 term?!?br> aggregations【執(zhí)行聚合】(最簡(jiǎn)單的聚合方法大致等于 SQL GROUPBY 和 SQL 聚合函數(shù))
具體使用方法見官網(wǎng):ElasticSearch官方文檔鏈接
3、分詞
一個(gè) tokenizer(分詞器)接收一個(gè)字符流,將之分割為獨(dú)立的 tokens(詞元,通常是獨(dú)立的單詞),然后輸出 tokens 流。例如,whitespace tokenizer 遇到空白字符時(shí)分割文本。它會(huì)將文本 “Quick brown fox!” 分割為 [Quick, brown, fox!]。該tokenizer(分詞器)還負(fù)責(zé)記錄各個(gè) term(詞條)的順序或 position 位置(用于 phrase 短語和 word proximity 詞近鄰查詢),以及 term(詞條)所代表的原始 word(單詞)的 start
(起始)和 end(結(jié)束)的 character offsets(字符偏移量)(用于高亮顯示搜索的內(nèi)容)。Elasticsearch 提供了很多內(nèi)置的分詞器,可以用來構(gòu)建 custom analyzers(自定義分詞器)。
(1)安裝 ik 分詞器
進(jìn)入 es 容器內(nèi)部 plugins 目錄
docker exec -it 容器 id /bin/bash
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-anal
ysis-ik-7.4.2.zip
unzip 下載的文件
rm –rf *.zip
mv elasticsearch/ ik
以確認(rèn)是否安裝好了分詞器
cd ../bin
elasticsearch plugin list:即可列出系統(tǒng)的分詞器
(2)測(cè)試分詞器
使用默認(rèn),請(qǐng)觀察結(jié)果
POST _analyze
{
"text": "我是中國人"
}
使用分詞器,請(qǐng)觀察結(jié)果
POST _analyze
{
"analyzer": "ik_smart", "text": "我是中國人"
}
具體使用技巧參考以下鏈接:ik分詞器github鏈接
五、Elasticsearch-Rest-Client
1)、9300:TCP
spring-data-elasticsearch:transport-api.jar:
- springboot 版本不同, transport-api.jar 不同,不能適配 es 版本
- 7.x 已經(jīng)不建議使用,8 以后就要廢棄
2)、9200:HTTP
- JestClient:非官方,更新慢
- RestTemplate:模擬發(fā) HTTP 請(qǐng)求,ES 很多操作需要自己封裝,麻煩
- HttpClient:同上
- Elasticsearch-Rest-Client:官方 RestClient,封裝了 ES 操作,API 層次分明,上手簡(jiǎn)單
最終選擇 Elasticsearch-Rest-Client(elasticsearch-rest-high-level-client)
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html文章來源:http://www.zghlxwxcb.cn/news/detail-841695.html
1、SpringBoot 整合
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>8.12</version>
</dependency>
2、配置
@Bean
RestHighLevelClient client() {
RestClientBuilder builder = RestClient.builder(new HttpHost("自己的虛擬機(jī)地址", 9200, "http"));
return new RestHighLevelClient(builder);
}
3、使用
參照官方文檔:文章來源地址http://www.zghlxwxcb.cn/news/detail-841695.html
@Test
void test1() throws IOException {
Product product = new Product();
product.setSpuName("華為");
product.setId(10L);
IndexRequest request = new IndexRequest("product").id("20")
.source("spuName","華為","id",20L);
try {
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
System.out.println(request.toString());
IndexResponse response2 = client.index(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException e) {
if (e.status() == RestStatus.CONFLICT) {
}
}
}
到了這里,關(guān)于ElasticSearch簡(jiǎn)介及常見用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!