美文网首页ElasticSearch
Elasticsearch之学习总结

Elasticsearch之学习总结

作者: 任嘉平生愿 | 来源:发表于2019-06-17 15:29 被阅读0次
1.ES存储数据的格式和mongo的数据格式是一样的都是以文档的形式
image.png
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

image.png

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

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

(1)通过命令curl http://192.168.229.151:9200


image.png

(2)通过es-haed


image.png
6.建立倒排索引的过程就是先分词,然后将文档属于哪个词下面加上序号。查询的过程就是哪个匹配度高哪个就在前面。分词的过程中会有大小写,相同语义,单复数停滞词等问题,可以指定分词器比如ik中文分词器。
7.下载ik分词器与ES继承
8.创建索引的时候应该先指定一些参数,比如主分片个数和副本个数

这里有个隐身的问题:设置多少分片和副本合适?依据是什么?
关于副本:副本对搜索性能非常重要, 同时用户也可在任何时候添加或删除副本. 额外的副本能给你带来更大的容量, 更高的呑吐能力及更强的故障恢复能力.
关于分片:因为主分片一旦被设置就不能更改,设置少了性能压力大,设置多了又浪费资源增加成本。
ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 我们推荐你最多分配7到8个分片.总之, 不要现在就为你可能在三年后才能达到的10TB数据做过多分配. 如果真到那一天, 你也会很早感知到性能变化的.

9.创建索引的时候不应该使用默认的mapping因为数据格式往往不是你想要的同时为后面的分词找麻烦例如。
image.png

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中详细的参数属性有很多


image.png
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\""
  
}
image.png
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"
}
image.png
15.各种查询

(1)精确查询

GET /lib1/user20190614/_search
{
  "query": {
    "term" : {
        "age" : 20
    }
  }
}
#name 中包含zhao li 就行  其实这个也不精确
GET /lib1/user20190614/_search
{
    "query": {
        "terms" : { "name" : ["zhao", "li"]}
    }
}
image.png

(2)分词查询

GET /lib1/user20190614/_search
{
  "query": {
    "match" : {
        "name" : "zhao"
    }
  }
}

(3)短语匹配match_phrase 区别在于必须精确匹配顺序一致

GET /lib1/user20190614/_search
{
    "query": {
        "match_phrase": {
            "name": "zhao si"
        }
    }
}
image.png

(4)查找按顺序排序

GET zhifou/doc/_search
{
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}
image.png

(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"
      }
    }
  }
}
image.png

(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"
          }
        }
      ]
      
    }
    
  }
}
image.png

(11)聚合查询min max avg

GET /lib3/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "zhao"
          }
        }
      ]
    }
     
    
  },"aggs": {
      "agg": { 
        "terms": { 
          "field": "age"
        }
      }
   }
}
image.png
GET /lib3/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "zhao"
          }
        }
      ]
    }
     
    
  },
  "aggs": {
      "avgs": { 
#avg min max  sum
       "avg": {
       
         "field" : "grade"
                   }
              
              }
        }
}
image.png
16.Elasticsearch分片机制

分片分为主分片和副本,当一个文档生成的时候会有一个routid然后,hash routeid 会在取模主分片会将文档存放在对应的节点。

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

当主分片的个数大于一般就可以执行,如果没有达到则会报超时。

20.deeppage深度分页查询时ES的痛点。当查询第990-1000中的前10条数据时他会从每个shared中先查询1000然后再合并也就是查询了1000的shared个数的倍数。
21.当需要修改mapping的时候只能创建对应的mapping然后再导入数据。
22.查询出来的文档的相关度的高低取决于1.TF/IDF.词条正在文档中出现的次数。2.关键字再当个文档中出现的次数3.文档的长度,长度越短匹配度越高。

相关文章

网友评论

    本文标题:Elasticsearch之学习总结

    本文链接:https://www.haomeiwen.com/subject/enmzxctx.html