草庐IT

初识 Elasticsearch

砖~ 2023-04-10 原文

一、 简介

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 计算各个年龄段里不同性别的平均存款余额

有关初识 Elasticsearch的更多相关文章

  1. ruby - Rails Elasticsearch 聚合 - 2

    不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a

  2. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  3. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

  4. ruby-on-rails - 使用 Rails (Tire) 和 ElasticSearch 进行模糊字符串匹配 - 2

    我有一个Rails应用程序,现在设置了ElasticSearch和Tiregem以在模型上进行搜索,我想知道我应该如何设置我的应用程序以对模型中的某些索引进行模糊字符串匹配。我将我的模型设置为索引标题、描述等内容,但我想对其中一些进行模糊字符串匹配,但我不确定在何处进行此操作。如果您想发表评论,我将在下面包含我的代码!谢谢!在Controller中:defsearch@resource=Resource.search(params[:q],:page=>(params[:page]||1),:per_page=>15,load:true)end在模型中:classResource'Us

  5. 美团外卖搜索基于Elasticsearch的优化实践 - 2

    美团外卖搜索工程团队在Elasticsearch的优化实践中,基于Location-BasedService(LBS)业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-LengthEncoding(RLE)设计了一款高效的倒排索引结构,使检索耗时(TP99)降低了84%。本文从问题分析、技术选型、优化方案等方面进行阐述,并给出最终灰度验证的结论。1.前言最近十年,Elasticsearch已经成为了最受欢迎的开源检索引擎,其作为离线数仓、近线检索、B端检索的经典基建,已沉淀了大量的实践案例及优化总结。然而在高并发、高可用、大数据量的C端场景,目前可参考的资料并不多。因此

  6. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  7. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  8. 【Linux】初识Linux --指令Ⅰ - 2

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法,Linux…感兴趣就关注我吧!你定不会失望。目录1.ls显示当前目录下的文件内内容2.pwd-显示用户当前所在的目录3.cd-改变工作目录。将当前工作目录改变到指定的目录下1.cd-回到上一次待的工作空间2.cd..返回上一层目录1.相对路径:cd../aurora2.绝对路径:cd/home/aurora/lesson1/aurora3.cd~进入用户家目录4.cd/进入root目录4.mkdir-新建目录5.rmdir/rm-删除1.rmdir删除空文件夹2.rm删除1.rm-f2.rm-i3.rm-r1.ls显示当前目

  9. ruby-on-rails - Elasticsearch 问题 : Cannot connect AWS elasticsearch service - 2

    我有一个关于配置elasticsearch以连接AWSelasticsearch服务以在生产环境中运行项目的问题。我的gem文件:gem'searchkick'gem'faraday_middleware-aws-signers-v4'gem'aws-sdk','~>2'gem"elasticsearch",">=1.0.15"引用:https://github.com/ankane/searchkick我的config/initializers/elasticsearch.rb文件:require"faraday_middleware/aws_signers_v4"ENV["ELAS

  10. linux查看es节点使用情况,elasticsearch(es) 如何查看当前集群中哪个节点是主节点(master) - 2

    elasticsearch查看当前集群中的master节点是哪个需要使用_cat监控命令,具体如下。查看方法es主节点确定命令,以kibana上查看示例如下:GET_cat/nodesv返回结果示例如下:ipheap.percentram.percentcpuload_1mload_5mload_15mnode.rolemastername172.16.16.188529952.591.701.45mdi-elastic3172.16.16.187329950.990.991.19mdi-elastic2172.16.16.231699940.871.001.03mdi-elastic4172

随机推荐