0%

Integer拆装箱问题

来看一个小题目

1
2
3
4
5
6
7
Integer a = 2;
Integer b = 2;
Integer c = 200;
Integer d = 200;

System.out.println(a == b); // true
System.out.println(c == d); // false

这是为啥呢,同样是比较两个相等的数,怎么一个是true一个是false呢

阅读全文 »

elasticsearch分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
GET _analyze
{
"text": "the dog is eating " // 被分析的语句
}


// 分析结果
{
"tokens": [
{
"token": "the",
"start_offset": 0,
"end_offset": 3,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "dog",
"start_offset": 4,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "is",
"start_offset": 8,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "eating",
"start_offset": 11,
"end_offset": 17,
"type": "<ALPHANUM>",
"position": 3
}
]
}

elasticsearch复杂查询

有时候查询语句会非常复杂,这时候肯定只能使用DSL查询了,使用各个简单子句合并成一个复杂的查询语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"bool":{ // 合并多个条件的布尔逻辑
"must":{ // 多个查询条件完全匹配,相当于and
"match":{
"field":""
}
},
"must_not":{ // 多个查询条件都不匹配,相当于not
"match":{
"field":""
}
},
"should":{ // 有一个条件匹配,相当于or
"match":{
"field":""
}
}
}
}
阅读全文 »

elasticsearch索引

映射

映射是用于进行字段类型确认的,将每个字段匹配为一种确定的数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// 查看文档结果
GET video/_mapping/default


{
"video": {
"mappings": {
"default": {
"properties": {
"age": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"doc_id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"doc_title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"duration": {
"type": "long"
},
"keywords": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"number": {
"type": "long"
}
}
}
}
}
}
阅读全文 »

健康状态red问题查找

有一天查数据的时候突然报错了,然后看了一下索引,发现该索引的health为red,先看一下索引层级的健康状况

1
GET _cluster/health?level=indices
索引层级健康状态

可以看到所有的分片都未分配

阅读全文 »

elasticsearch分片

索引其实只是一个用来指向一个或多个分片shard的逻辑命名空间,文档是保存在索引的分片中,然后在分片中被索引,分配到集群中的节点上

分片又分为主分片和复制分片,复制分片是主分片的一个副本,可以防止硬件故障导致的数据丢失,当索引创建好的时候主分片的数量就已经确认好了,而复制分片可以随时调整

1
2
3
4
5
6
{
"settings":{
"number_of_shards": 5, //五个主分片
"number_of_replicas": 0 // 0个复制分片,这里是因为我使用的是单机,所以没有设置复制分片
}
}

elasticsearch集群

elasticsearch是高可用且可扩展的,可以通过增加节点来增加可靠性,一个节点就是一个elasticsearch实例,一个集群由一个或多个节点组成,具有相同的cluster.name,当加入新节点或删除一个节点时,集群会感知到并平衡数据。集群中一个节点会被选举为主节点master,来管理集群的一些变更,主节点不参与文档的变更和搜索

查看集群中节点

1
GET _cluster/state/nodes

观察集群的健康情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
GET _cluster/health

{
"cluster_name": "elasticsearch",
"status": "green", // 集群服务状况,green表示所有主要分片和复制分片都可用;yellow表示所有主要分片都可用,但不是所有复制分片都可用;red表示不是所有的主要分片都可用
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 15,
"active_shards": 15,
"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
}

elasticsearch简介

elasticsearch是基于Lucene的开源搜索引擎,虽然Lucene性能很好且功能齐全,但是非常复杂,所以elasticsearch使用Lucene作为核心来实现所有索引和搜索的功能,目的是通过简单地restful api来隐藏Lucene的复杂性

集群

elasticsearch集群是一组有这相同集群名称(cluster.name)的节点集合,共享数据并提供故障转移和扩展功能

层次对应

elasticsearch中的数据对应关系型数据层次对比

关系型数据库 elasticsearch
db数据库 索引indices
table表 类型type(在6.x每个索引下只能创建一个type,在7.x直接不允许创建type,只有一个默认type)
row数据行 文档Document
column字段 字段field
阅读全文 »

elasticsearch基本操作

基于6.8.x版本

统计操作

计算集群中的文档数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GET _count?pretty
{
"query":{
"match_all": {}
}
}


{
"count": 5091327,
"_shards": {
"total": 10,
"successful": 10,
"skipped": 0,
"failed": 0
}
}
阅读全文 »

elasticsearch6.x写入优化

translog 调整

默认的配置是

1
2
3
4
5
6
7
8
9
10
11
12
13
"index":{
"translog": {
"generation_threshold_size": "64mb",
"flush_threshold_size": "512mb",
"sync_interval": "5s",
"retention": {
"size": "512mb",
"age": "12h"
},
"durability": "REQUEST"
}
}

也就是说每个请求都会进行flush,这样保证了数据不会丢失,但是写入性能会很差,可以设置为异步,持久化策略为周期性和一定大小的时候flush

1
2
3
4
5
6
"index": {
"translog": {
"sync_interval": "60s",
"durability": "async"
}
}

这样就调整为60s(sync_interval)刷新一次或者当超过512m(flush_threshold_size)进行刷新