资源:
Elasticsearch 中文文档
youtube视频资源
Docker安装es
Docker desktop安装es
基础概念
- 索引:含有相同属性的文档(例如可以用一个索引代表消费者数据,用一个索引代表产品数据)
- 类型:索引可以定义一个或多个类型,文档必须属于一个类型(索引是通过一个名字进行识别,必须是英文小写)
- 文档:文档是可以被索引的基本数据单位(比如一个用户基本信息,一篇文章的数据等,es里面最小存储单位)【对象】
索引相当于sql里面的databases,类型相当于table,文档相当于表中一行记录
(es 7.x及更高版本中弱化了类型的概念,每个适应只能包含一个默认的类型_doc,并且推荐将所有文档都存储在这个默认类型下,以前es版本允许同一个索引中定义多个类型,但是在7.x中被弃用,在8.x中完全删除)
- 分片:每个索引都有多个分片,每个分片是一个Lucene索引
- 备份:拷贝一份分片就完成了分片的备份(备份分片可以执行搜索操作,分摊搜索压力)
(es创建索引时,默认创建5个分片,一份备份,分片数量只能在创建索引时指定,备份数量就可以随时修改)
Elasticsearch
1、介绍
es支持PB级的结构化和非结构化数据处理。
es是分布式文档存储中间件,存储的是序列化为JSON文档的数据结构。使用的是倒排序索引的数据结构,这种结构支持快速全文搜索。
倒排序索引里列出所有文档中出现的每一个唯一单词并分别标识每个单词在哪一个文档中。
es会自动检测将新字段添加到索引里面,自动检测数据类型,我们也可以用Mapping去定义映射规则。
应用场景:
1、海量数据分析引擎
2、站内搜索引擎
3、数据仓库
es是个分布式系统,我们可以将服务器(节点)添加到集群中用以增加容量,es分配数据可查询会自动负载到所有可用节点,不需要我们大幅修改应用程序。es自动平衡多节点集群。
url: http://127.0.0.1:9200/
性能配置:分片越多,维护这些索引的开销越多,分片越大,当es需要重新平衡集群时,分片移动需要的时间越长。通常情况下,每1GB的分片数最好少于20个。
容灾:出于性能考虑,集群中的节点要在同一网络中,不同网络的节点会让集群平衡节点时消耗时间过长。但高可用架构要求避免所有鸡蛋放同一个篮子。所以有了个方法:跨集群复制(CCR)。CCR自动将索引从主集群同步到可用作热备份的辅助远程集群。可以使用CCR创建从集群,以接管地理位置近的用户,提供读取请求服务。
跨集群复制是主动+被动,主集群是主动索引,并处理所有写入请求,然后复制到从节点,从集群不做适应操作,只做接收。
(主集群已经完成了索引操作,并将数据复制到从节点,所以,从节点可以直接读取主节点上已经索引好的数据。)
运维:Kibana 是守护,管理和监控es集群的工具。
url: http://127.0.0.1:5601
2、查询和分词
搜索数据:
Elasticsearch REST API支持结构化查询,全文本查询和结合这两种查询的复杂查询。
结构化查询类似SQl,可以搜索单个字段、执行短语搜索、相似性搜索和前缀搜索,自动返回匹配建议
es在优化的数据结构中搜索非文本数据,这些数据结构支持高性能地理和数字查询
分析数据:
es聚合API能够构建数据的复杂摘要,深入了解关键指标,模式和趋势。
3、Docker安装es
docker pull elasticsearch:7.7.0
docker run --name es -d -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.7.0
docker run -d --name kibana -e ELASTICSEARCH_HOSTS=http://服务器ip:9200 -p 5601:5601 kibana:7.7.0
kibana切换中文操作
#进入容器
docker exec -it kibana /bin/bash
#进入配置文件目录
cd /usr/share/kibana/config
#编辑文件kibana.yml
vi kibana.yml
#在最后一行添加如下配置
i18n.locale: zh-CN
#保存退出
exit
#并重启容器
docker restart kibana
4、用put get请求
在kibana控制台进入也可以使用
RESTFul API基本格式:http://<ip>:<port>/<索引>/<类型>/<文档id>
常用http动词:GET/PUT/POST/DELETE
5、批量插入
POST _bulk
{"index":{"_index":"customer", "_id":"2"}}
{"name":"Jane Smith"}
{ "index" : { "_index" : "customer", "_id" : "3" } }
{ "name": "Bob Johnson" }
可以不指定index,这时会自动生成index
POST /customer/_bulk
{"index":{}}
{"name":"张三"}
{"index":{}}
{"name":"李四", "age":18}
有一个json文件导入es(在终端进行操作)
curl -H "Content-Type: application/json" -XPOST "http://127.0.0.1:9200/bank/_bulk?pretty&refresh" --data-binary "@C:/Users/work/Desktop/accounts.json"
- "http://127.0.0.1:9200" 是 Elasticsearch 的地址。
- "bank" 是目标索引的名称。
- "@C:/Users/work/Desktop/accounts.json" 是包含数据的 JSON 文件的路径。
- ?pretty:这是一个查询参数,用于让 Elasticsearch 返回格式化良好的 JSON 响应,以提高可读性。
- &refresh:这是另一个查询参数,用于在批量导入后刷新索引,以使导入的数据立即可用于搜索。
curl "http://127.0.0.1:9200/_cat/indices?v"
- _cat是 Elasticsearch 中的一种用于查询和显示集群状态和信息的特殊 API 端点
- _cat/indices 端点用于列出所有索引的基本信息,包括索引名称、文档数量、分片数量等
- ?v 参数请求以更可读的方式显示结果
6、搜索数据
查找所有数据(默认情况下返回前10个文档),用account_number进行排序,搜索第
GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
],
"from": 10,
"size": 10
}
匹配搜索address包含mill或lane字符的数据,如果是全部匹配,match替换为match_phrase即可
GET /bank/_search
{
"query": { "match": { "address": "mill lane" } }
}
用bool值可以组合多个查询条件,每个条件都会影响文档相关得分,得分越高文档跟搜索条件匹配得越好
GET /bank/_search
{
"query":{
"bool": {
"must": [
{"match": {
"age": "40"
}}
],
"must_not": [
{"match": {
"state": "ID"
}}
],
"filter": [
{"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}}
]
}
}
}
7、聚合分析
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_city": {
"terms": {
"field": "city.keyword",
"order": {
"average_balance": "desc"
}
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
"size": 0 表示了返回只有聚合结果,无具体数据。
以city的值进行分组,组内计算balance的平均值