ElasticSearch简介及常见用法

简介

Elasticsearch 是 Elastic Stack 核心的分布式搜索和分析引擎。 Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。 Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。 Elasticsearch 可以快速索引、搜索和分析海量数据。
Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
官方文档(推荐):官方文档链接
官方中文:官方中文文档链接
社区中文:xiaoleilu.comcodingdict.com

一、基本概念

1、Index(索引)

动词:相当于 MySQL 中的 insert;
名词:相当于 MySQL 中的 Database。

2、Type(类型)

在 Index(索引)中,可以定义一个或多个类型。类似于 MySQL 中的 Table,同种类型的数据放在一起。

3、Document(文档)

保存在某个索引(Index)下,某种类型(Type)的一个数据(Document),文档是 JSON 格式的,Document 就像是 MySQL 中的某个 Table 里面的内容。

二、Docker 安装 Es

1、下载镜像文件

docker pull elasticsearch:8.12 :存储和检索数据
docker pull kibana:8.12 :可视化检索数据

2、创建实例

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/ #保证权限
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \ #设置初始内存和占用最大内存
-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为自己的虚拟机地址

三、初步检索

1、_cat

GET /_cat/nodes:查看所有节点
GET /_cat/health:查看 es 健康状况
GET /_cat/master:查看主节点
GET /_cat/indices:查看所有索引 show databases

2、索引一个文档(保存)

在 customer 索引下的 external 类型下保存 1 号数据为:

POST customer/external/1 
{ 
"name": "John Doe"
}
#PUT 和 POST 都可以,
#POST 新增。如果不指定 id,会自动生成 id。指定 id 就会修改这个数据,并新增版本号
#PUT 可以新增可以修改。PUT 必须指定 id;由于 PUT 需要指定 id,我们一般都用来做修改
#操作,不指定 id 会报错。

3、查询文档

GET customer/external/1
结果:

{ 
	"_index": "customer", //在哪个索引
	"_type": "external", //在哪个类型
	"_id": "1", //记录 id
	"_version": 2, //版本号
	"_seq_no": 1, //并发控制字段,每次更新就会+1,用来做乐观锁
	"_primary_term": 1, //同上,主分片重新分配,如重启,就会变化
	"found": true, "_source": { //真正的内容
	"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 操作会对比源文档数据,如果相同不会有什么操作,文档 version 不增加PUT 操作总会将数据重新保存并增加 version 版本;带_update 对比元数据如果一样就不进行任何操作。
看场景:
对于大并发更新,不带 _update;
对于大并发查询偶尔更新,带 _update;对比更新,重新计算分配规则。

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

四、进阶索引

1、SearchAPI

ES 支持两种基本方式检索 :

  • 一个是通过使用 REST request URI 发送搜索参数(uri+检索参数)
  • 另一个是通过使用 REST request body 来发送它们(uri+请求体)

检索信息

  • 请求参数方式检索
GET bank/_search?q=*&sort=account_number:asc
#响应结果解释:
took - Elasticsearch 执行搜索的时间(毫秒)
time_out - 告诉我们搜索是否超时
_shards - 告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分片
hits - 搜索结果
hits.total - 搜索结果
hits.hits - 实际的搜索结果数组(默认为前 10 的文档)
sort - 结果的排序 key(键)(没有则按 score 排序)
score 和 max_score –相关性得分和最高得分(全文检索用)
  • uri+请求体进行检索
GET bank/_search
{ 
	"query": { 
		"match_all": {}
	},
	"sort": [
		{ 
			"account_number": { 
				"order": "desc"
			}
		}
	]
}

2、Query DSL

(1) 基本语法格式
Elasticsearch 提供了一个可以执行查询的 Json 风格的 DSL(domain-specific language 领域特定语言)。这个被称为 Query DSL。该查询语言非常全面,并且刚开始的时候感觉有点复杂,真正学好它的方法是从一些基础的示例开始的。

  • 一个查询语句 的典型结构:
{
	QUERY_NAME: {
		ARGUMENT: VALUE, 
		ARGUMENT: VALUE,... 
	}
}
  • 如果是针对某个字段,那么它的结构如下:
{
	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 中组合非常多的查询类型完成复杂查询
  • 除了 query 参数之外,我们也可以传递其它的参数以改变查询结果。如 sort,size
  • from+size 限定,完成分页功能
  • sort 排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准

其他常用的语法比如
match【匹配查询】
match_phrase【短语匹配】
multi_match【多字段匹配】
bool【复合查询】
filter【结果过滤】
term【全文检索字段用 match,其他非 text 字段匹配用 term。】
aggregations【执行聚合】(最简单的聚合方法大致等于 SQL GROUPBY 和 SQL 聚合函数)
具体使用方法见官网:ElasticSearch官方文档链接

3、分词

一个 tokenizer(分词器)接收一个字符流,将之分割为独立的 tokens(词元,通常是独立的单词),然后输出 tokens 流。例如,whitespace tokenizer 遇到空白字符时分割文本。它会将文本 “Quick brown fox!” 分割为 [Quick, brown, fox!]。该tokenizer(分词器)还负责记录各个 term(词条)的顺序或 position 位置(用于 phrase 短语和 word proximity 词近邻查询),以及 term(词条)所代表的原始 word(单词)的 start
(起始)和 end(结束)的 character offsets(字符偏移量)(用于高亮显示搜索的内容)。Elasticsearch 提供了很多内置的分词器,可以用来构建 custom analyzers(自定义分词器)。
(1)安装 ik 分词器
进入 es 容器内部 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
以确认是否安装好了分词器
cd ../bin
elasticsearch plugin list:即可列出系统的分词器

(2)测试分词器
使用默认,请观察结果

POST _analyze
{ 
	"text": "我是中国人"
}

使用分词器,请观察结果

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 已经不建议使用,8 以后就要废弃

2)、9200:HTTP

  • JestClient:非官方,更新慢
  • RestTemplate:模拟发 HTTP 请求,ES 很多操作需要自己封装,麻烦
  • HttpClient:同上
  • Elasticsearch-Rest-Client:官方 RestClient,封装了 ES 操作,API 层次分明,上手简单

最终选择 Elasticsearch-Rest-Client(elasticsearch-rest-high-level-client)
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.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("自己的虚拟机地址", 9200, "http"));
	return new RestHighLevelClient(builder);
}

3、使用

参照官方文档:

@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) {
		}
	}
}

相关推荐

  1. ElasticSearch简介常见

    2024-03-19 16:10:04       16 阅读
  2. npm 的常见指令

    2024-03-19 16:10:04       17 阅读
  3. python中nonlocal简介

    2024-03-19 16:10:04       21 阅读
  4. golang中fallthrough简介

    2024-03-19 16:10:04       23 阅读
  5. ElasticSearch基本

    2024-03-19 16:10:04       7 阅读
  6. Elasticsearch简介安装

    2024-03-19 16:10:04       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-19 16:10:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-19 16:10:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-19 16:10:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-19 16:10:04       18 阅读

热门阅读

  1. C++ QT串口通信(1)-串口模块QtSerialPort详解

    2024-03-19 16:10:04       20 阅读
  2. 数据库表的查询

    2024-03-19 16:10:04       17 阅读
  3. 每天学习一个Linux命令之rm

    2024-03-19 16:10:04       22 阅读
  4. C语言经典例题 --- 公因数、素数、闰年

    2024-03-19 16:10:04       18 阅读
  5. 零基础学python:8、 函数的基础

    2024-03-19 16:10:04       22 阅读
  6. Electron框架初识:原理与实践优势深度解读

    2024-03-19 16:10:04       13 阅读
  7. 2分钟速览!chatgpt的使用方法

    2024-03-19 16:10:04       16 阅读