> 文档中心 > ES快速上手

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 章节《你知道的, 为了搜索…》