ES快速上手
如果你像我开始一样好奇ElasticSearch究竟能干什么?那么文章可能适合你看看。本文对ElasticSearch做一个简介及快速上手,主要例子来源于官网。
本文只需要你安装有docker、可发送curl请求即可操作。
二话不说,先在本地通过docker搭建一个可访问的ElasticSearch服务(以下简称ES)
docker安装ES
docker network create elasticdocker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.3docker run --name es01-test --net elastic -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.3
如果你希望一个可视化操作,可以通过Kibana,本文不做详细介绍,一切从简。
员工文档业务需求:
1.支持包含多值标签、数值、以及全文本的数据
2.检索任一员工的完整信息
3.允许结构化搜索,比如查询30岁以上的员工
4.允许简单的全文搜索以及较复杂的短语搜索
5.支持在匹配文档内容中高亮显示搜索片段
6.支持基于数据创建和管理分析仪表盘(本文不做支持)
介绍
对于员工目录,我们将做如下操作:
1.每个员工索引一个文档,文档包含该员工的所有信息。
2.每个文档都将是 employee 类型 。
3.该类型位于 索引 megacorp 内。
剩下的操作只需要通过curl来请求ES,在终端执行curl即可开始访问。
1.添加单个员工
curl -X PUT "localhost:9200/megacorp/employee/1?pretty" -H 'Content-Type: application/json' -d'{ "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ]}'
2.添加多个员工
curl -X PUT "localhost:9200/megacorp/employee/2?pretty" -H 'Content-Type: application/json' -d'{ "first_name" : "Jane", "last_name" : "Smith", "age" : 32, "about" :"I like to collect rock albums", "interests": [ "music" ]}'curl -X PUT "localhost:9200/megacorp/employee/3?pretty" -H 'Content-Type: application/json' -d'{ "first_name" : "Douglas", "last_name" : "Fir", "age" : 35, "about": "I like to build cabinets", "interests": [ "forestry" ]}'
// 请求curl -X GET "localhost:9200/megacorp/employee/1?pretty"// 返回{ "_index" : "megacorp", "_type" : "employee", "_id" : "1", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests" : [ "sports", "music" ] }}
3.查询全部员工
// 请求curl -X GET "localhost:9200/megacorp/employee/_search?pretty"// 返回{ "took" : 324, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "megacorp", "_type" : "employee", "_id" : "1", "_score" : 1.0, "_source" : { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests" : [ "sports", "music" ] } }, { "_index" : "megacorp", "_type" : "employee", "_id" : "2", "_score" : 1.0, "_source" : { "first_name" : "Jane", "last_name" : "Smith", "age" : 32, "about" : "I like to collect rock albums", "interests" : [ "music" ] } }, { "_index" : "megacorp", "_type" : "employee", "_id" : "3", "_score" : 1.0, "_source" : { "first_name" : "Douglas", "last_name" : "Fir", "age" : 35, "about" : "I like to build cabinets", "interests" : [ "forestry" ] } } ] }}
4.带条件查询
// 请求curl -X GET "localhost:9200/megacorp/employee/_search?q=last_name:Smith&pretty"// 返回{ "took" : 958, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 0.4700036, "hits" : [ { "_index" : "megacorp", "_type" : "employee", "_id" : "1", "_score" : 0.4700036, "_source" : { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests" : [ "sports", "music" ] } }, { "_index" : "megacorp", "_type" : "employee", "_id" : "2", "_score" : 0.4700036, "_source" : { "first_name" : "Jane", "last_name" : "Smith", "age" : 32, "about" : "I like to collect rock albums", "interests" : [ "music" ] } } ] }}
5.使用查询表达式搜索
// 请求curl -X GET "localhost:9200/megacorp/employee/_search?pretty" -H 'Content-Type: application/json' -d'{ "query" : { "match" : { "last_name" : "Smith" } }}'// 返回 (同例4)
6.复杂查询
curl -X GET "localhost:9200/megacorp/employee/_search?pretty" -H 'Content-Type: application/json' -d'{ "query" : { "bool": { "must": { "match" : { "last_name" : "smith" } }, "filter": { "range" : { "age" : { "gt" : 30 } } } } }}'
7.关联查询
curl -X GET "localhost:9200/megacorp/employee/_search?pretty" -H 'Content-Type: application/json' -d'{ "query" : { "match" : { "about" : "rock climbing" } }}'
8.短语查询
curl -X GET "localhost:9200/megacorp/employee/_search?pretty" -H 'Content-Type: application/json' -d'{ "query" : { "match_phrase" : { "about" : "rock climbing" } }}'
9.1聚合
// 请求curl -X GET "localhost:9200/megacorp/employee/_search?pretty" -H 'Content-Type: application/json' -d'{ "aggs": { "all_interests": { "terms": { "field": "interests.keyword" } } }}'// 返回{ "took" : 454, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "megacorp", "_type" : "employee", "_id" : "1", "_score" : 1.0, "_source" : { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests" : [ "sports", "music" ] } }, { "_index" : "megacorp", "_type" : "employee", "_id" : "2", "_score" : 1.0, "_source" : { "first_name" : "Jane", "last_name" : "Smith", "age" : 32, "about" : "I like to collect rock albums", "interests" : [ "music" ] } }, { "_index" : "megacorp", "_type" : "employee", "_id" : "3", "_score" : 1.0, "_source" : { "first_name" : "Douglas", "last_name" : "Fir", "age" : 35, "about" : "I like to build cabinets", "interests" : [ "forestry" ] } } ] }, "aggregations" : { "all_interests" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "music", "doc_count" : 2 }, { "key" : "forestry", "doc_count" : 1 }, { "key" : "sports", "doc_count" : 1 } ] } }}
9.2 聚合+条件
curl -X GET "localhost:9200/megacorp/employee/_search?pretty" -H 'Content-Type: application/json' -d'{ "query": { "match": { "last_name": "smith" } }, "aggs": { "all_interests": { "terms": { "field": "interests.keyword" } } }}'
9.3 聚合+结果
curl -X GET "localhost:9200/megacorp/employee/_search?pretty" -H 'Content-Type: application/json' -d'{ "aggs" : { "all_interests" : { "terms" : { "field" : "interests.keyword" }, "aggs" : { "avg_age" : { "avg" : { "field" : "age" } } } } }}'
相信一通操作下来就有点感觉了,和Mysql的insert、select可以对比一下,当然目前为止这还只是ES最简单的套路。
总结
本文通过docker运行es,并给出员工的例子进行了简单介绍。
Q1
:再次运行docker run时遇到报错
docker: Error response from daemon: Conflict. The container name "/es01-test" is already in use by container "414ad17fb21a8a0ac7295bda1440a5646a92110f7f9ed94c5dcfd291d8213d64". You have to remove (or rename) that container to be able to reuse that name.
解决
:docker rm es01-test
删除镜像后重新操作即可。
Reference
ES快速上手:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/getting-started.html#getting-started
ES权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html 章节《你知道的, 为了搜索…》