Elasticsearch入门和基本使用
1. 什么是Elasticsearch?
Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统;Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。用于快速存储,搜索和海量数据分析;
2. Elasticsearch的优点
1)横向可扩展性:只需要增加一台机器,添加一些配置即可;
2)分片机制提供很好的分布性:同一个索引有多个分片(sharding);
3)高可用:提供复制机制。一个分片就可以设置多个复制;
4)使用简单:一条命令就可以下载文件,快速搭建一个站内搜溹引擎;
3. Elasticsearch的特点
1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司;
2)Elasticsearch主要是将全文检索、数据分析以及分布式技术,合并在了一起,形成了独一无二的ES;
3)对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂;
4)全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;这是传统数据库是做不到的,Elasticsearch作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能;
4. Elasticsearch的功能
1)分布式的搜索引擎和数据分析引擎
2)全文检索,结构化检索,数据分析
全文检索:我想搜索商品名称包含牙膏的商品,select * from products where product_name like "%牙膏%"
结构化检索:我想搜索商品分类为日化用品的商品都有哪些,select * from products where category_id='日化用品'
数据分析:我们分析每一个商品分类下有多少个商品,select category_id,count(*) from products group by category_id
3)对海量数据进行近实时的处理
分布式:ES自动可以将海量数据分散到多台服务器上去存储和检索;
海量数据的处理:分布式以后,就可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理了;
近实时:在秒级别对数据进行搜索和分析;检索个数据要花费1小时--离线批处理,batch-processing;
5. Elasticsearch的核心概念
1)Near Realtime(NRT):近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级;
2)Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常;
3)Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群
4)Document&field:文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。document类似于数据库的行;
5)Index:索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。索引类似于SQL中的一个数据库;索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。
6)Type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。Type类似于数据库的表;
7)shard:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。
8)replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。
6.Elasticsearch的安装
1) 安装jdk1.8;
2) 解压Elasticsearch的安装包;运行bin目录下的elasticsearch.bat;
3) 检查ES是否启动成功:http://localhost:9200/?pretty
name: node名称
cluster_name: 集群名称(默认的集群名称就是elasticsearch)
version.number: 5.2.0,es版本号
4)解压Kibana安装包,他是开发界面操作es;
5)启动Kibana:bin\kibana.bat;进入Dev Tools界面;
6)GET _cluster/health
7. Elasticsearch的基本使用
1)面向文档的搜索分析引擎
{ "email": "aa@sina.com", "first_name": "a", "last_name": "a", "info": { "bio": "curious and modest", "age": 11, "interests": [ "b", "c" ] }, "join_date": "2018/11/01" }
2)快速检查集群的健康状况
GET /_cat/health?v
green:每个索引的primary shard和replica shard都是active状态的
yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
red: 不是所有索引的primary shard都是active状态的,部分索引有数据丢失了
为什么现在会处于一个yellow状态?
我们现在就一个笔记本电脑,就启动了一个es进程,相当于就只有一个node。现在es中有一个index,就是kibana自己内置建立的index。由于默认的配置是给每个index分配5个primary shard和5个replica shard,而且primary shard和replica shard不能在同一台机器上(为了容错)。现在kibana自己建立的index是1个primary shard和1个replica shard。当前就一个node,所以只有1个primary shard被分配了和启动了,但是一个replica shard没有第二台机器去启动。
3)快速查看集群中有哪些索引
GET /_cat/indices?v
4)简单的索引操作
创建索引:PUT /test_index?pretty
删除索引:DELETE /test_index?pretty
5)商品的CRUD操作
(1)新增商品:新增文档,建立索引 PUT /index/type/id { "json数据" } PUT /ecommerce/product/1 { "name" : "gaolujie yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer" : "gaolujie producer", "tags": [ "meibai", "fangzhu" ] } es会自动建立index和type,不需要提前创建,而且es默认会对document每个field都建立倒排索引,让其可以被搜索; (2)查询商品:检索文档 GET /index/type/id GET /ecommerce/product/1 (3.1)修改商品:替换文档 PUT /ecommerce/product/1 { "name" : "jiaqiangban gaolujie yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer" : "gaolujie producer", "tags": [ "meibai", "fangzhu" ] } 替换方式有一个不好,即必须带上所有的field,才能去进行信息的修改 (3.2)修改商品:更新文档 POST /ecommerce/product/1/_update { "doc": { "name": "jiaqiangban gaolujie yagao" } } (5)删除商品:删除文档 DELETE /ecommerce/product/1
8. Elasticsearch的几种查询方式
1)query string search(用的少了)
GET /索引名称/type名称/_search
搜索全部商品:GET /ecommerce/product/_search
GET /ecommerce/product/_search?q=name:yagao&sort=price:desc
took:耗费了几毫秒
timed_out:是否超时,
_shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以)
hits.total:查询结果的数量
hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高
hits.hits:包含了匹配搜索的document的详细数据
2)query DSL
DSL:Domain Specified Language,特定领域的语言
查询所有的商品
GET /ecommerce/product/_search
{
"query": { "match_all": {} }
}
查询名称包含yagao的商品,同时按照价格降序排序
GET /ecommerce/product/_search
{
"query" : {
"match" : {
"name" : "yagao"
}
},
"sort": [
{ "price": "desc" }
]
}
分页查询商品
GET /ecommerce/product/_search
{
"query": { "match_all": {} },
"from": 1,
"size": 1
}
指定要查询出来商品的名称和价格就可以
GET /ecommerce/product/_search
{
"query": { "match_all": {} },
"_source": ["name", "price"]
}
3)query filter
搜索商品名称包含yagao,而且售价大于25元的商品
GET /ecommerce/product/_search
{
"query" : {
"bool" : {
"must" : {
"match" : {
"name" : "yagao"
}
},
"filter" : {
"range" : {
"price" : { "gt" : 25 }
}
}
}
}
}
4)full-text search(全文检索)
GET /ecommerce/product/_search
{
"query" : {
"match" : {
"producer" : "yagao producer" //字段名:包含的文字
}
}
}
5)phrase search(短语搜索)
要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回
GET /ecommerce/product/_search
{
"query" : {
"match_phrase" : {
"producer" : "yagao producer"
}
}
}
6)highlight search(高亮搜索结果)
GET /ecommerce/product/_search
{
"query" : {
"match" : {
"producer" : "producer"
}
},
"highlight": {
"fields" : {
"producer" : {}
}
}
}