ES 基础操作
集群
健康值的三种状态
Green:所有索引的所有分片均可用
primary
和replice
均可用。Yellow 至少有一个
replice
不可以用, 但是所有的primary
正常。Red 至少有一个
primary
不可用。
健康值查询
GET _cat/health?v # 列表的形式查看
GET _cluster/health # json的格式查看 (推荐使用)
kibana 集群 -> 堆栈监控里可视化查看
健康值查询详情
{
"cluster_name" : "docker-cluster", # 集群名称
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1, # 总节点数
"number_of_data_nodes" : 1, # 存储数据节点
"active_primary_shards" : 13, # 总切片数
"active_shards" : 13,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
全文检索
全文检索,是索引系统通过扫描文章中的每个词,对每个词都建立索引,并指出在文章中出现的次数和位置,当用户查找时,索引系统会根据事先建立的索引进行查找,并将查到的结果反馈给用户的检索方式。
id | title | desc |
---|---|---|
1 | are you kidding ? | 你是凯迪吗? |
2 | No im sure china | 不,我是秀儿 |
3 | made in china | 麦迪在中国 |
are you kidding ? No im sure made in china
term index (词项索引) | term dictionary (词项字典) | Posting List (倒排表) |
---|---|---|
im | 2 | |
are | 1 | |
china | 2,3 | |
No | 2 |
分词
大颗粒度的分词
GET _analyze
{
"analyzer": "ik_smart",
"text": ["我喜欢刘德华的歌"]
}
更小颗粒度的分词
GET _analyze
{
"analyzer": "ik_max_word",
"text": ["我喜欢刘德华的歌"]
}
压缩算法
FOR、RoaringBitmap :倒排表
FST 词项索引,接近于 hash 算法
其他重要概念
节点
- 一个节点就是一个 es 实例
- 一个节点并不是一个物理机,但是建议一台机器上安装只启动一个节点
- 节点的角色分为 选举节点、数据节点、冷节点、热节点等。
分片
es7
以后默认只有一个主分片,主分片的数量一旦确认就不能更改。但是副本可以任意修改数量- es 可以自动的进行分片的再平衡
- 一个
doc
不可能存在于多个主分片中,但是可以存在于多个副本中 - 每个主分片和其副分片不能存在与同在一个节点上。
索引
查看索引的健康值
GET _cat/indices?v
查看某一个的索引信息
GET kibana_sample_data_logs/_search
删除索引
DELETE /shopping?pretty
映射
映射方式分为两种:
- 动态映射(自动映射)
- 静态映射(手动映射)
es 的支持的具体的数据类型,建议去 es 官网查看
数字类型。
long
、integer
、short
、double
、float
。keyworlds: 适合于索引结构化数据,可以应用于过滤、排序、聚合。
keyword
类型的字段只能通过精确值搜索到。索引的id
应该使用keyworld
类型。dates 时间类型。
text: 字段是可以全文检索的、不用于排序,很少用于聚合。text 默认只创建倒排索引,不会创建倒正排索引。
object: 创建单个的 JSON 对象
nested: 用于JSON 对象的字符数组。
为什么不能给 text 类型创建正排索引?是因为加载高基数的 text 的时候,字段索引一旦加载到堆中,就会一直在那里。
默认映射类型
- 整数:long
- 浮点:float
- true|false boolean
- 日期:date
- 数组:取决于数组中的第一个字段
- 对象:object
- 字符串:不是数字和日期类型,就会被映射成
text
和keyword
两个类型。
J除上述类型外,其余类型必须显示指名
查看映射
get /product/_mapping
创建 mobile_phone 索引
PUT /mobile_phone
{
"mappings": {
"properties": {
"classify": {
"properties": {
"color": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"memory": {
"type": "text"
}
}
},
"des": {
"type": "text",
"analyzer": "ik_max_word"
},
"isdel":{
"type": "boolean"
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"price": {
"type": "long"
},
"publish_time": {
"type": "date"
},
"tags": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}}}}}}
创建 person 索引
索引中,height 是不能被检索的
PUT /person
{
"mappings": {
"properties": {
"name": {
"type": "text",
"index": true
},
"sex": {
"type": "keyword",
"index": true
},
"height": {
"type": "long",
"index": false
}
}}}
查询
添加数据
GET shopping/_search
DELETE shopping?pretty
PUT shopping
{
"mappings": {
"properties": {
"name":{
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"keyword":{
"type": "keyword",
"ignore_above": 256
}
}
},
"category":{
"type": "keyword"
},
"price":{
"type": "double"
}
}
}
}
POST shopping/_doc/1
{
"name":"小米 12s pro",
"category":"手机",
"price":"5399.00"
}
POST shopping/_doc/2
{
"name":"小米 12x",
"category":"手机",
"price":"2869.00"
}
POST shopping/_doc/3
{
"name":"红米 Note11",
"category":"手机",
"price":"1199.00"
}
POST shopping/_doc/4
{
"name":"红米 K40s",
"category":"手机",
"price":"2149.00"
}
POST shopping/_doc/5
{
"name":"红米 buds4",
"category":"耳机",
"price":"199.00"
}
POST shopping/_doc/6
{
"name":"红米 buds3",
"category":"耳机",
"price":"169.00"
}
POST shopping/_doc/7
{
"name":"华为 Mate 50 Pro",
"category":"手机",
"price":"7799.00"
}
POST shopping/_doc/8
{
"name":"华为HUAWEI FreeBuds 4E",
"category":"耳机",
"price":"579.00"
}
POST shopping/_doc/9
{
"name":"华为HUAWEI FreeLace Pro",
"category":"耳机",
"price":"399.00"
}
更改数据
将华为手机的价格改为 5499
POST /shopping/_update/Wu_7y4AB4H2nHiu3of8g
{
"doc":{
"price":5499
}
}
简单查询
match_all: 没有任何查询条件。
match:匹配查询,会将查询条件进行分词,多个分词查询以后是 or 的关系。
multi_match:与match类似,不同的是可以在多个字段中查询
term:精确匹配,不会对查询条件进行分词
terms:支持多个关键字精确查询
range:范围查询
match_phrase: 1.查询条件分词后都必须匹配,类似match中的
operator=and
;2.文档匹配的顺序必须与查询条件分词匹配后一致
详细参考:https://blog.csdn.net/LeoHan163/article/details/126433158
查询示例
# 查询所有数据,默认最多10个。
GET shopping/_search
{
"query": {
"match_all": {}
}
}
# match 会将查询条件分词。然后进行查询;而且不的词之间是 or 的关系
GET shopping/_search
{
"query": {
"match": {
"name": "华为小米"
}}}
# 查询条件分词,但是存储数据不分词。
GET shopping/_search
{
"query": {
"match": {
"name.keyword": "小米 12x"
}}}
# 多字段查找;多个字段是 and的关系
GET shopping/_search
{
"query": {
"multi_match": {
"query": "华为手机",
"fields": ["name","category"]
}}}
# term 精确匹配
GET shopping/_search
{
"query": {
"term": {
"name": {
"value": "小米"
}}}}
# match_phrase
GET shopping/_search
{
"query": {
"match_phrase": {
"name": "小米"
}}}
# terms 的多字段查询
GET shopping/_search
{
"query": {
"terms": {
"name": [
"小米",
"华为"
]}}}
# 查询价格在 1000 到 2000 之间的。
GET shopping/_search
{
"query": {
"range": {
"price": {
"gte": 1000,
"lte": 2000
}}}}
对搜索结果,数量进行限制,只取两个
GET shopping/_search
{
"query": {
"match": {
"name": "手机"
}
},
"from": 1,
"size": 2
}
对查询结果限制、排序
# 只想取某一个字段
GET shopping/_search
{
"query": {
"match_all": {}
}
, "_source": ["name"]
}
# 对查询结果数量限制
GET shopping/_search
{
"query": {
"match_all": {}
},
"from": 1,
"size": 2
}
# 对价格进行排序
GET shopping/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
范围查找;搜索价格从 100 到 1000 之间的电子产品
GET shopping/_search
{
"query": {
"bool": {
"filter": {
"range": {
"price": {
"gte": 100,
"lte": 1000
}
}}}}}
# 对于时间格式的查询
GET website/_search
{
"query": {
"range": {
"post_date": {
"gte": "2/1/2018",
"lte": "2019",
"format": "dd/MM/yyyy||yyyy"
}}}}
bool 查询
must
必须满足的条件,会计算评分must not
必须不满足,不会计算评分should
满不满足无所谓,但会计算评分filter
必须满足条件,但是不会计算评分
bool 查询示例
# 查看属于手机,但不是小米的数据
GET shopping/_search
{
"query": {
"bool": {
"filter": [
{"term": {
"category": "手机"
}}
],
"must_not": [
{
"match": {
"name": "小米"
}}]}}}
对查询结果高亮显示
GET shopping/_search
{
"query": {
"match": {
"name": "华为手机"
}
},
"highlight": {
"fields": {
"name":{}
}}
}
聚合
es
的聚合查询流程,一般分为两步
- 分组
- 组内聚合
聚合索引的示例
GET shopping/_search
{
"size": 0, //不需要返回数据
"aggs": {
"iphone-sum": { //给聚合索引起个名,手机总价
"sum": {
"field": "price" //计算总价
}
},
"iphone-min":{
"min": {
"field": "price"
}
},
"iphone-max":{
"max": {
"field": "price"
}}}}
GET shopping/_search
{
"size": 0,
"aggs": {
"group-category": { // 先给桶聚合起个名
"terms": {
"field": "category", // 选择分桶的字段
"size": 10, // 最多显示多少条
"order": {
"_count": "desc" //根据每个桶内样例个数正排
}
},
"aggs": {
"avg-price": { // 每个桶内继续子聚合
"avg": {
"field": "price"
}
},
"hits": {
"top_hits": { // 每个桶内,显示一个样例数据
"size": 1,
"_source": [
"src_ip",
"user_id"
]
}}}}}}
参考文献
- https://blog.csdn.net/LeoHan163/article/details/126433158
- https://www.bilibili.com/video/BV1h3411P7cM?p=21&share_source=copy_web&vd_source=80cf96a12f63a1720dfc645c2eb041c0
最新文章
- Latex中画出函数文件的调用关系拓扑图
- mysql数据库 myisam数据存储引擎 表由于索引和数据导致的表损坏 的修复 和检查
- Delphi IP 控件源码
- GTK+中的树状列表构件(GtkTreeView)
- iOS开发总结-类似京东分类,UICollectionView
- <;一>;初探js特效魅力之选项卡05
- 饿了么移动APP的架构演进(转)
- Spring Boot 基础教程系列学习文档
- Struts2 控制文件上传下载
- [leetcode-581-Shortest Unsorted Continuous Subarray]
- IT团队之非正式沟通
- Python实现简易Web服务器
- PAT乙级-1037. 在霍格沃茨找零钱(20)
- 新版MATERIAL DESIGN 官方动效指南(一)
- Caused by: java.lang.ClassNotFoundException: Could not load requested class :XXX.XXX.XXX 异常处理
- Educational Codeforces Round 8 B. New Skateboard
- fjwc2019 D1T1 全连(dp+树状数组)
- 解决Redisson出现Failed to instantiate [org.redisson.api.RedissonClient]: Factory method &#39;create&#39; threw exception; nested exception is java.lang.ArrayIndexOutOfBoundsException: 0的问题
- PCL中使用FLANN库(1)
- c++primer记录(二) 模板