初识 Elasticsearch

一、 简介

1.1、 基本概念

        index(索引): 相当于 MySQL 的数据库 database

        type (类型): 相当于 MySQL 的表 table ( elasticsearch 7.0 以上已开始弃用这个概念 )

        document(文档):相当于 MySQL 的数据行

 1.2、 倒排索引机制

二、 Docker 安装 Elasticsearch

docker pull elasticsearch:7.4.2     #存储和检索数据 
docker pull kibana:7.4.2            #可视化检索数据
# 创建 Elasticsearch 实例
sudo docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms 1024m -Xmx 1024m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2

# 创建 Kibana 实例
sudo docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.23.150:9200 -p 5601:5601 -d kibana:7.4.2

三、 初步使用

        使用浏览器打开 kibana 可视化页面,并使用 dev tools 对 elasticsearch 进行操作

 

3.1、 保存文档

        保存一个数据,指定数据的 索引 、 类型 、 唯一标识

PUT customer/external/1
{
        "name": "John Doe"
}

PUT 和 POST 都可以,

POST 新增。如果不指定 id,会自动生成 id。指定 id 就会修改这个数据,并新增版本号

PUT 可以新增可以修改。PUT 必须指定 id;由于 PUT 需要指定 id,我们一般都用来做修改操作,不指定 id 会报错。

3.2、 查询文档

 GET customer/external/1


结果:
{
    "_index": "customer",        //在哪个索引
    "_type": "external",        //在哪个类型
    "_id": "1",                    //记录 id
    "_version": 2,                //版本号
    "_seq_no": 1,                //并发控制字段,每次更新就会+1,用来做乐观锁
    "_primary_term": 1,            //同上,主分片重新分配,如重启,就会变化
    "found": true,
    "_source": {
        //真正的内容    
        "name": "John Doe"
    }
}


更新携带 ?if_seq_no=0&if_primary_term=1

 3.3、 更新文档

POST customer/external/1/_update 

    // POST _update 必须加上 "doc"
    "doc":{ 
        "name": "John Doew" 
    } 
}
或者
POST customer/external/1 

    "name": "John Doe2" 
}
或者
PUT customer/external/1 

    "name": "John Doe" 
}


不同:
    POST 带 _update 会比对原文档数据,若比对相同,则无操作,且文档 version 不增加 
    PUT 操作总会将数据重新保存并增加 version 版本; 
    

看场景; 
    对于大并发更新,不带 update; 
    对于大并发查询偶尔更新,带 _update;对比更新,重新计算分配规则。 


更新 同时增加属性 
POST customer/external/1

    "doc": { 
        "name": "Jane Doe", 
        "age": 20 
    } 
}
PUT 和 POST 都可以

3.4、 删除 文档 或 索引

DELETE customer/external/1 
DELETE customer

四、 进阶检索

        ES 支持两种基本方式检索 : 
                一个是通过使用 REST request URI 发送搜索参数(uri+检索参数) 
                另一个是通过使用 REST request body 来发送它们(uri+请求体)

4.1、DSL 基本语法

        Elasticsearch 提供了一个可以执行查询的 Json 风格的 DSL(domain-specific language 领域特 定语言)。这个被称为 Query DSL

4.2、 match_all 

GET bank/_search { 
    "query": { 
        "match_all": {} 
    },
    "from": 0, 
    "size": 5, 
    "sort": [ { "account_number": { "order": "desc" } } ] 
}


query 定义如何查询, 
match_all 查询类型【代表查询所有的所有】,es 中可以在 query 中组合非常多的查 询类型完成复杂查询  
    除了 query 参数之外,我们也可以传递其它的参数以改变查询结果。
        如 sort,size from+size 限定,完成分页功能  
                        sort 排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准

4.3 match (分词匹配)

GET bank/_search { 
    "query": { 
        "term": { "age": "mill road" } 
    } 
}


最终查询出 address 中包含 mill 或者 road 或者 mill road 的所有记录,并给出相关性得分

4.4 match_phrase(不分词匹配)

GET bank/_search { 
    "query": { 
        "match_phrase": { "address": "mill road" } 
    } 
}


查出 address 中包含 mill road 的所有记录,并给出相关性得分

4.5 term(精确匹配,非文本类型)

GET bank/_search { 
    "query": { 
        "term":  { "age": 18 } 
    } 
}


精确匹配查询 age 为 18 的 

4.6 multi_match(多字段匹配)

GET bank/_search { 
    "query": { 
        "multi_match": { 
            "query": "mill",
            "fields" ["state","addres"]
        } 
    } 
}


查出 state 或者 address 包含 mill

4.7 复合查询

GET bank/_search { 
    "query": { 
        "bool": { 
            "must": [ { "match": { "address": "mill" } }, 
                      { "match": { "gender": "M" } } 
                    ],
            "should": [ {"match": { "address": "lane" }} ],
            "must_not": [ {"match": { "email": "baluba.com" }} ] 
        } 
    }
}


address 包含 mill,并且 gender 是 M,如果 address 里面有 lane 最好不过,但是 email 必须不包含 baluba.com

4.8 Filter(范围查询)

GET bank/_search { 
    "query": { 
        "bool": { 
            "must": [ {"match": { "address": "mill"}} ],
            "filter": { 
                "range": { "balance": { "gte": 10000, "lte": 20000 }   // 限定查询范围 [10000,20000]
                } 
            } 
        } 
    } 
}


选出 address 必须包含 mill ,并在其中过滤出余额在 [10000,20000] 之间的账户

 4.9 聚合查询

GET bank/account/_search

    "query": { "match_all": {} },
    
    "aggs": { 
        // 最外层聚合, 按年龄分布聚合
        "age_agg": { 
            "terms": { "field": "age", "size": 100 },
            
            "aggs": { 
                // 第二层聚合, 按年龄段中的性别聚合
                "age_gender_agg": { 
                    "terms": { "field": "gender.keyword", "size": 100 },
                    
                    
                    "aggs": { 
                        // 第三层聚合, 按年龄段中的性别计算平均存款余额
                        "age_gender_balance_avg": { 
                            "avg": { "field": "balance" } 
                        } 
                    } 
                },
                
                // 第二层聚合, 按年龄段计算平均存款余额
                "age_balance_avg":{ 
                    "avg": { "field": "balance" } 
                } 
            } 
        } 
    },
    "size": 1000 
}


选出所有账户(size=1000),并进行聚合

        1. 先进行年龄 age 的 groupby ,avg 计算各个年龄段的平均存款余额

        2. 先进行年龄 age 的 groupby ,  再在里面进行性别 gender 的 groupby ,最后是 avg 计算各个年龄段里不同性别的平均存款余额

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值