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)