面向文档型数据库elasticSearch
作用:检索数据、分布式存储、数据分许ELK
集群-节点(服务器)-索引-类型-文档
ES 与 MYSQL比对 database -- index table -- type row -- document column -- field schema -- mapping 语句对应 select * from -- GET http://... update table set -- PUT http://...ES基本的增删改查
ES RESTful API GET 获取请求对象的当前状态 POST 改变对象的当前状态 PUT 创建一个对象 DELETE 销毁对象 HEAD 请求获取对象的基础信息 # 新建索引 PUT /indexname { "settings":{ "index":{ "number_of_shards":3, # 分片数量 "number_of_replicas":1 # 复制备份数量 }, "analysis":{ "analzyer":{ "analzyer_name":{ "type":"custom", "tokenizer":"standard", "filter":[ "lowercase", "autocomplete_filter" ] } } } },"mappings":{ "type_name":{ "properties":{ "filed_name":{ "type":"string", "analyzer":"" } } } } } # 列出所有索引 GET /_cat/indices # 查询索引设置信息 GET /indexname/_settings GET /_all/_settings #查询所有索引设置 #删除 DELETE /indexnamemapping types
每个索引都有一个或多个映射类型(mapping type)来对索引内的文档进行逻辑分组(mapping type 就是平常所说的 type)。
# 新增mapping或为mapping添加字段 POST /index_name/type_name/_mapping?pretty # 美化json输出,_source字段不会被美化 # 可以新增字段不能改变字段,原因是一个字段的类型修改以后,那么该字段的所有数据都需要重新索引。添加文档
PUT /index_name/type_name/1 # id,可以不填,es自动生成,则只能用POST方法 POST /index_name/type_name查询文档
GET /index_name/type_name/id修改文档
PUT /index_name/type_name/id # PUT方法修改会覆盖原来的文档 POST /index_name/type_name/id/_update #post修改,针对field修改搜索 _search
注意:ES的关键字都要加前缀_ ,所以我们在定义索引、类型名称时不要带_
GET /_search # 返回全部数据 响应字段解释 hits 匹配到的信息 _idnex _type _id 文档信息 _source 每个文档对应的全部信息 field_name:value took 搜索耗时 _shards : total字段:参与查询的分片数 successful和failed:成功和失败的分片数 timeout 可以定义超时 GET /_search?timeout=10ms # 多索引和多类别 /_search #在所有索引中搜素 /index1/_search #在索引1中搜素 /index1,index2/_search @在索引1和2中搜素 /a*,b*/_search #在以a b开头的索引中搜素 /_all/type1,type2/_search #在所有index的type1和2中搜素 # 分页,相当于sql中limit和offset GET /_search?size=5 GET /_search?size=5&from=5term query会去倒排索引中寻找确切的term,它并不知道分词器的存在,这种查询适合keyword、numeric、date等明确值的,
term:查询某个字段里含有某个关键词的文档
terms:查询某个字段里含有多个关键词的文档
GET /customer/doc/_search/ { "query": { "terms": { "title": [ "blog","first"] } } }filter是不计算相关性的,同时可以缓存(第二次搜索会很快)。因此filter速度快于query。
{ "size": 0, "filter": { "bool": { "must": [ { "terms": { "keyword": [ "手机", "iphone" ] } }, { "range": { "cdate": { "gt": "2015-11-09T11:00:00" } } } ] } } } # 过滤条件 # bool过滤 {"bool" : {"must":[],"should":[],"must_not":[] } } must:必须满足的条件 (相当于and) should:可以满足也可以不满足的条件 (相当于or) must_not:不需要满足的条件 (相当于not) # 范围过滤 gt:> lt:< gte:>= lte:<= # range关键词 :表示范围三、综合使用
语法{query:{filtered:{}}}
{ "query":{ "filtered":{里面写query语句,对过滤后的结果匹配}, "filter":{里面写过滤条件} } } bool四、聚合查询
sum聚合 { "size": 0, //表示查询多少条文档,聚合只需总和结果,输出文档可以设置为0条 "aggs": { //aggs表示是聚合查询 "price_of_sum": {//自行取名作为结果集 "sum": { "field":"price" } } } } min聚合 { "size": 0, "aggs": { "price_of_min": { "min": { "field": "price" } } } } avg聚合 求平均值 { "size": 0, "aggs": { "price_of_avg": { "avg": { "field": "price" } } } } cardinality聚合 求基数的聚合 { "size": 0, "aggs": { "price_of_cardi": { "cardinality": { //其实相当于该字段互不相同的值有多少类,输出的是种类数 "field": "price" } } } } terms聚合 { "size": 0, "aggs": { "price_of_by": { "terms": { "field": "price" //按价格来分组 } } } }ES集群
ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 一个集群拥有相同的cluster.name 配置的节点组成, 它们共同承担数据和负载的压力 主节点负责管理集群的变更例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作 集群健康 1.GET /_cluster/health 返回值中的status 是我们关注的 green 主副分片均正常 yellow 主都正常,不是所有的副都正常 red 所有主分片都不正常 分片的特点 Elasticsearch 是利用分片将数据分发到集群内各处 分片是数据的容器,文档保存在分片内 分片又被分配到集群内的各个节点里 当集群规模变动,ES会自动在各个节点中迁移分片。使得数据任然均匀分布在集群中 副分片是主分片的一个拷贝,作为硬件故障时的备份。并提供返回文档读操作 在创建索引时,确定主分片数,但是副分片可以在后面进行更改 在更新一个文档时的ES内部操作 Elasticsearch 已将旧文档标记为已删除,并增加一个全新的文档。 尽管你不能再对旧版本的文档进行访问,但它并不会立即消失。 当继续索引更多的数据,Elasticsearch 会在后台清理这些已删除文档 ES如何处理冲突 使用乐观并发控制 利用 _version 号来确保 应用中相互冲突的变更不会导致数据丢失 通过外部系统使用版本控制 文档的部分更新 文档不能被修改,只能被替换 如何路由一个文档到一个分片中 当索引一个文档时,我们怎么知道这个文档在什么位置 使用下面的这个路由选择公式 1.shard = hash(routing) % number_of_primary_shards 下面将对这个公式每个字段进行分析 shard 哪个分片, 也就是分片id routing 一个可变值,默认是文档的id hash 一个哈希函数,对rounting字段进行哈希计算生成一个数字 number_of_primary_shards 主分片的数量,routing字段经过hash函数计算之后的值,将对 主分片的数量也就是 number_of_primary_shards 进行取与,之后得到的shard就是我们文档所在的分片的位置 https://www.cnblogs.com/wangshouchang/p/8049492.htmlES别名
在es里面index aliases就像是软连接一样,它可以映射一个或多个索引,提供了非常灵活的特性,使用它我们可以做到:
(1)在一个运行中的es集群中无缝的切换一个索引到另一个索引上
(2)分组多个索引,比如按月创建的索引,我们可以通过别名构造出一个最近3个月的索引
(3)查询一个索引里面的部分数据构成一个类似数据库的视图(views)