elasticSearch学习以及DSL基础

ES DSL

面向文档型数据库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 /indexname

mapping 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=5
一、query查询
term、terms查询

term query会去倒排索引中寻找确切的term,它并不知道分词器的存在,这种查询适合keyword、numeric、date等明确值的,

term:查询某个字段里含有某个关键词的文档

terms:查询某个字段里含有多个关键词的文档

GET /customer/doc/_search/
{
  "query": {
    "terms": {
      "title":  [ "blog","first"]
    }
  }
}
match查询,进行分词后查询
GET /customer/doc/_search/

{
  "query": {
    "match": {
      "title":  "my ss"   #它和term区别可以理解为term是精确查询,这边match模糊查询;match会对my ss分词为两个单词,然后term对认为这是一个单词
    }
  }
}

# match_all:查询所有文档
{
  "query": {
    "match_all": {}
  }
}

# multi_match:可以指定多个字段
{
  "query": {
    "multi_match": {
      "query" : "blog",
      "fields":  ["name","title"]   #只要里面一个字段包含值 blog 既可以
    }
  }
}

# match_phrase:短语匹配查询
ES引擎首先分析查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变

_source:当我们希望返回结果只是一部分字段时,可以加上_source
{
  "_source":["title"],  #只返回title字段
  "query": {
    "match_all": {}
  }
}

sort :排序desc,asc
{
	"query": {
		"match": {
			"teamNameEn": "Rockets"
		}
	},
	"sort": [{
			"playYear": {
				"order": "desc"
			}
		},
		{
			"heightValue": {
				"order": "asc"
			}
		}
	]
}

fuzzy:模糊查询
    value:查询的关键字
    boost:查询的权值,默认值是1.0
    min_similarity:设置匹配的最小相似度,默认值0.5,对于字符串,取值0-1(包括0和1);对于数值,取值可能大于1;对于日期取值为1d,1m等,1d等于1天
    prefix_length:指明区分词项的共同前缀长度,默认是0
二、filter过滤

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.html

ES别名

在es里面index aliases就像是软连接一样,它可以映射一个或多个索引,提供了非常灵活的特性,使用它我们可以做到:

(1)在一个运行中的es集群中无缝的切换一个索引到另一个索引上

(2)分组多个索引,比如按月创建的索引,我们可以通过别名构造出一个最近3个月的索引

(3)查询一个索引里面的部分数据构成一个类似数据库的视图(views)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值