这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
ElasticSearch是什么
借用ElasticSearch官网 Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。
- 基于Apache Lucene构建的开源搜索引擎
- 采用Java编写,提供简单易用的RESTFul API
- 轻松的横向扩展,可以支持PB级的结构化或非结构化数据处理
Elasticsearch用途:常用于程序搜索,网站搜索,日志处和分析
快速开始
Docker安装Elasticsearch
Elasticsearch下载地址: www.elastic.co/cn/download… 。 这里使用Docker下载运行Elasticsearch
## 下载es镜像
docker pull elasticsearch:7.4.2
## 下载kibana镜像
docker pull kibana:7.4.2
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
chmod -R 777 /mydata/elasticsearch
## 启动es容器
docker run --name elasticsearch -p 9200:9200 \
-p 9300:9300 -e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms128m -Xmx512m" \
-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容器
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://{HOST的IP}:9200 -p 5601:5601 -d kibana:7.4.2
通过http://ip:9200 访问es;
{
"name" : "e88a7d84048c",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "4JdkRlV4RYm_LLoYaUf37Q",
"version" : {
"number" : "7.4.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
"build_date" : "2019-10-28T20:40:44.881551Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
Elasticsearch基本概念
文档(Document)
Elasticsearch是面向文档的,文档时Elasticsearch中所有可搜索数据的最小单位。它相当于关系型数据库中的一行记录。文档时以JSON格式保存在Elasticsearch,每个文档都有自己的ID,可以自己指定,也可以由Elasticsearch自动生成。
索引(Index)
Elasticsearch中的索引数据管理的顶层单位,是文档的容器,相当于关系型数据库里的database。Elasticsearch 可以把索引存放在一台机器或者分散在多台服务器上,每个索引有一或多个分片(shard),每个分片可以有多个副本(replica)。
类型(Type)
在6.0以前,一个Index下可以有多个Type,它相当于关系型数据库中的table。在6.X中,Type被废弃。7.0以后的版本,一个Index只能创建一个_doc的Type。
倒排索引
Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
| 关系型数据库 | Elasticsearch |
|---|---|
| Table | Index (7.0以前是Type) |
| Row | Document |
| Column | Field |
| Schema | Mapping |
| SQL | DSL |
Elasticsearch CRUD
创建空索引
## 创建一个空索引
PUT /techbook
{
"settings": {
"index": {
"number_of_shards": "2", //分片数
"number_of_replicas": "0" //副本数
}
}
}
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "techbook"
}
插入数据
POST /{index}/{type}/{id}
当不指定Id时。就是新增,看到返回的原数据信息:生成了一个_id串,_version是1,result是"created"。
当指定Id时,如果ES中Id不存在,则用指定的Id来新增这个文档。
如果Id存在,则修改指定文档
可以看到返回结果中,version+1,result为updated
PUT方式
POST是新增,如果不指定id,会自动生成id。指定Id会修改指定id的这个数据,并增加版本号_version。
PUT可以新增也可以修改,当Id不存在时,就创建文档,当Id存在时,就更新文档。
PUT不同于POST之处是:PUT必须指定Id,不指定Id会报错
{
"error": "Incorrect HTTP method for uri [/book/_doc/?pretty] and method [PUT], allowed: [POST]",
"status": 405
}
查询数据
GET /{index}/{type}/{id}
GET /techbook/_doc/1
返回信息如下
{
"_index" : "techbook",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"title" : "Mysql Crash Course",
"price" : "59.00",
"author" : "Ben Forta",
"tag" : "Database;Mysql;SQL"
}
}
删除数据
DELETE /{index}/{type}/{id}
DELETE /techbook/_doc/1
返回结果:
{
"_index" : "techbook",
"_type" : "_doc",
"_id" : "1",
"_version" : 3,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 4,
"_primary_term" : 1
}
Bulk API
批量操作可以减少网络请求次数。
- 指定索引
POST /techbook/_doc/_bulk
{"index":{"_id":1001}}
{"title":"深入理解计算机系统","price": "99.00","author": "Randal E.Bryant", "tag":"系统"}
{"index":{"_id":1002}}
{"title":"算法)","price": "99.00","author": "Robert Sedgewick", "tag":"算法"}
{"index":{"_id":1003}}
{"title":"高性能MySQL","price": "99.00","author": "施瓦茨", "tag":"MySQL"}
- 不指定索引
POST /_bulk
{ action: { metadata }}
{ request body }
{ action: { metadata }}
{ request body }
POST /_bulk
{"create":{"_index":"users","_type":"_doc","_id":1}}
{"name":"张三丰","age": 99,"gender": "男"}
{"create":{"_index":"users","_type":"_doc","_id":2}}
{"name":"张无忌","age": 20,"gender": "男"}
Search API
Elasticsearch支持两种方式的检索:一种是使用Rest request url发送带参数的请求。另一种是把参数放到Request Body中的。
准备数据
DELETE /techbook
POST /techbook/_doc/_bulk
{"index":{"_id":1001}}
{"title":"深入理解计算机系统","price": 99.00,"author": "Randal E.Bryant", "tag":"系统"}
{"index":{"_id":1002}}
{"title":"算法","price": 99.00,"author": "Robert Sedgewick", "tag":"算法"}
{"index":{"_id":1003}}
{"title":"高性能MySQL","price": 99.00,"author": "施瓦茨", "tag":"MySQL"}
{"index":{"_id":1004}}
{"title":"MySQL必知必会","price": 39.00,"author": "Ben Forta", "tag":"MySQL"}
{"index":{"_id":1005}}
{"title":"深入理解Java虚拟机","price": 79.00,"author": "周志明", "tag":"Java"}
URI Search
GET /{index}/_search?q={search}&df={field}&sort={key}}:asc&from=0&size=10
参数说明
- q :指定查询语句
- df : 查询的字段,当不指定df时,查询所有字段
- sort : 排序字段
- from,size :分页数据
例如查询名称带有java的书籍
GET /techbook/_search?q=Java&df=title
查询所有书,通过价格升序排序
GET /techbook/_search?q=*&sort=price:asc
Query DSL
Elasticsearch提供了一种可以支持查询的JSON风格的DSL(domain-specific language领域特定语言)。
term查询
term 主要用于精确匹配,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型)
## 语法
GET /techbook/_search
{
"query": {
"term": {
"FIELD": {
"value": "VALUE"
}
}
}
}
range查询
按照指定范围查找数据。范围操作符包含:gt : 大于; gte 大于等于; lt : 小于; lte: 小于等于
match查询
match 查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match 一下查询字符:
如果用match 时指定了一个特定值,在遇到数字,日期,布尔值或者not_analyzed 的字符串时,它将为你搜索你 给定的值:
bool查询
可以用来构造多个条件查询结果的布尔逻辑,它包含以下操作符:
- must : 多个查询条件的完全匹配,相当于 and 。
- must_not : 多个查询条件的相反匹配,相当于 not 。
- should : 至少有一个查询条件匹配,相当于 or 。
例如: 查标签带MySQL的,价格不能大于59的书籍。
更多Query DSL内容请参考www.elastic.co/guide/en/el…