Elasticsearch之学习总结
1.ES存储数据的格式和mongo的数据格式是一样的都是以文档的形式

2.部分参数的意义
_seq_no:严格递增的顺序号,每个文档一个,Shard级别严格递增,保证后写入的Doc的_seq_no大于先写入的Doc的_seq_no。
任何类型的写操作,包括index、create、update和Delete,都会生成一个_seq_no。这个是不可改的,而_version这个版本号是可以改的.
_primary_term:_primary_term也和_seq_no一样是一个整数,每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1。
_primary_term主要是用来恢复数据时处理当多个文档的_seq_no一样时的冲突,比如当一个shard宕机了,raplica需要用到最新的数据,就会根据_primary_term和_seq_no这两个值来拿到最新的document
3.es是以rest请求对文档进行增上改查
(1)通过curl -x 命令
curl -XGET http://192.168.229.151:9200/lib1/user20190614/1

(2)通过kibana
GET /lib1/user20190614/1

(3)通过java代码参考我这边文章
Elasticsearch之restful接口调用 - 简书
4.ES在集群启动的时候一定要指定一个用户如esuser否则会报错
5.查看ES启动成功
(1)通过命令curl http://192.168.229.151:9200

(2)通过es-haed

6.建立倒排索引的过程就是先分词,然后将文档属于哪个词下面加上序号。查询的过程就是哪个匹配度高哪个就在前面。分词的过程中会有大小写,相同语义,单复数停滞词等问题,可以指定分词器比如ik中文分词器。
7.下载ik分词器与ES继承
8.创建索引的时候应该先指定一些参数,比如主分片个数和副本个数
这里有个隐身的问题:设置多少分片和副本合适?依据是什么?
关于副本:副本对搜索性能非常重要, 同时用户也可在任何时候添加或删除副本. 额外的副本能给你带来更大的容量, 更高的呑吐能力及更强的故障恢复能力.
关于分片:因为主分片一旦被设置就不能更改,设置少了性能压力大,设置多了又浪费资源增加成本。
ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 我们推荐你最多分配7到8个分片.总之, 不要现在就为你可能在三年后才能达到的10TB数据做过多分配. 如果真到那一天, 你也会很早感知到性能变化的.
9.创建索引的时候不应该使用默认的mapping因为数据格式往往不是你想要的同时为后面的分词找麻烦例如。

age是int,也就是说默认为text会分词。所以需要自己创建mapping.
PUT /lib2
{
"mappings": {
"properties": {
"title": { "type": "text" },
"name": { "type": "keyword" },
"age": { "type": "integer" },
"created": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
}
}
}
}
mapping中详细的参数属性有很多

10.一些查询的关键词的意思
_setting 查看配置信息
_mapping 查看映射
_bulk 批量加入
查询
https://my.oschina.net/weiweiblog/blog/1574020
11.批量增加_bulk 增加的数量是有限制的默认大小在10-15m 默认在1000-500个文档
12.ES在解决并发的时候采用的是CAS乐观锁的机制。版本号。配合外围数据库时要version一定要大于当前version否则修改不成功。
13.更新操作
POST /lib1/user20190614/1/_update
{
"script":"ctx._source.name = \"zhaoming\""
}

14.external 修改操作
version_type=external,唯一的区别在于,_version,只有当你提供的version与es中的_version一模一样的时候,才可以进行修改,只要不一样,就报错;当version_type=external的时候,只有当你提供的version比es中的_version大的时候,才能完成修改
PUT /lib1/user20190614/1?version=5&version_type=external
{
"name": "zhao"
}

15.各种查询
(1)精确查询
GET /lib1/user20190614/_search
{
"query": {
"term" : {
"age" : 20
}
}
}
#name 中包含zhao li 就行 其实这个也不精确
GET /lib1/user20190614/_search
{
"query": {
"terms" : { "name" : ["zhao", "li"]}
}
}

(2)分词查询
GET /lib1/user20190614/_search
{
"query": {
"match" : {
"name" : "zhao"
}
}
}
(3)短语匹配match_phrase 区别在于必须精确匹配顺序一致
GET /lib1/user20190614/_search
{
"query": {
"match_phrase": {
"name": "zhao si"
}
}
}

(4)查找按顺序排序
GET zhifou/doc/_search
{
"sort": [
{
"age": {
"order": "desc"
}
}
]
}

(5)通配符匹配查询
GET /lib3/user/_search
{
"query": {
"wildcard": {
"name": {
"value": "zhao*"
}
}
}
}
(6)前缀匹配
GET /lib3/user/_search
{
"query": {
"prefix": {
"name": {
"value": "zha"
}
}
}
}
(7)模糊查询
GET /lib3/user/_search
{
"query": {
"fuzzy": {
"name": {
"value": "zha"
}
}
}
}

(8)控制查询出来的文档个数from size
GET /lib3/user/_search
{
"from": 0,
"size": 1,
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
(9)查询出来只现实指定的字段
GET /lib3/user/_search
{
"from": 0,
"size": 1,
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
(10)组合查询 should must
GET /lib3/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "zhao"
}
}
],
"should": [
{"match": {
"name": "zhao"
}
}
]
}
}
}

(11)聚合查询min max avg
GET /lib3/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "zhao"
}
}
]
}
},"aggs": {
"agg": {
"terms": {
"field": "age"
}
}
}
}

GET /lib3/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "zhao"
}
}
]
}
},
"aggs": {
"avgs": {
#avg min max sum
"avg": {
"field" : "grade"
}
}
}
}

16.Elasticsearch分片机制
分片分为主分片和副本,当一个文档生成的时候会有一个routid然后,hash routeid 会在取模主分片会将文档存放在对应的节点。
17.当主分片的个数确定了以后是不可以修改的,每一个shared对应一个luncene实例,为什么不能改主分片的个数是因为分片机制确定。当集群中为黄色的时候是因为所有的主分片没有对应的副本。es集群中的选举指制度是paoxs算法及zookeeper,当有多数节点认可即可。
18.ESput修改和删除文件时不会删除文档而是在后面加一个标记del.。
19.ES关于数据一致性的问题采用,quorum机制及保证大部分写成功。
当主分片的个数大于一般就可以执行,如果没有达到则会报超时。