elasticsearch简介
elasticsearch简称为es,是一个开源的高扩展的分布式全文检索引擎,可以几乎实时的存储、检索数据;本身的扩展性很好,可以扩展到上百台服务器上,处理PB级别的数据。elasticsearch也使用Java开发,并使用Lucene作为其核心来实现索引和搜索功能,但是他通过简单的RESTFul Api来隐藏了Lucene的复杂性,让全文搜索变得简单。
elasticsearch与Solr的对比
- Solr使用了zookeeper进行分布式管理,而elasticsearch自身带有分布式协调管理工具;
- Solr支持更多格式的数据,而elasticsearch仅支持json格式数据;
- Solr官方提供的功能更多,而elasticsearch本身更注重于核心功能,高级功能多有第三方插件提供;
- Solr在传统的搜索应用中表现与elasticsearch,但在处理实时搜索应用时效率明显低于elasticsearch
elasticsearch相关概念
elasticsearch是面向文档的,它可以存储整个对象或者文档(document)。它不尽可以存储,而且可以索引(index)每个文档的内容使其可以被搜索。在elasticsearch中,你可以对文档进行索引、搜索、排序、过滤。下面介绍elasticsearch中的几个核心概念。
索引
索引是具有某些特征文档的集合。如客户索引、产品索引、订单索引。索引由一个全小写的名称标识,对数据的添加、删除、更新、搜索等操作,均需指定索引名称。单个集群中可以创建任意数量的索引。
类型(type)
目前在elasticsearch的8.*版本中已经对type完全废弃,在7.*版本中不在建议使用,在6.*版本中单个索引只能有一个类型。
弃用该概念的原因:
在之前的版本中把Index比作 RDB 的 Database,Type 比作 RDB 的 Table。这种不太恰当,RDB 中,Table
之前相互独立,同名的字段在两个表中毫无关系。但是在ES中,同一个 Index 下不同的 Type 如果有同名的字段,他们会被 Luecence 当作同一个字段
,并且他们的定义必须相同。所以,实际上之前的说法是不对的。因此 ES 官方将逐渐弃用 Type 的概念,
每个Index只能定义一个 Mapping Type。
文档(document)
文档是构建索引的基本单元。例如一条客户数据、一条产品数据、一条订单数据都可以是一个文档。文档以json格式表示,json是一种普遍使用的互联网数据格式。
在index中可以存储任意数量的文档。虽然文档在物理上存储在索引文件中,但是必须在存储文档时将其分配给索引中特定的类型。
字段(field)
相当于是数据表的字段,对文档数据根据不同属性进行分类。
映射(mapping)
mapping是处理数据的方式和规则方面做得一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等。这些都是映射里面可以设置的,其他就是处理es里面数据的一些使用规则设置也叫映射,按着最优规则处理数据对性能提高很大,因此需要建立映射,并且思考如何建立映射才对性能提升最大。
接近实时(Near Realtime)
elasticsearch是一个接近实时的搜索平台,从索引一个文档到这个文档可以被搜索到有一个轻微的延时(通常是1秒以内)
集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有整个数据,并一起提供索引和搜索功能。一个集群由一个位于的名字标识(默认的名字是elasticsearch),一个节点只能通过指定这个集群的名字来加入集群。
节点(node)
一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。一个节点也是由一个名字来标识。
一个节点可以通过配置集群名称的方式加入一个集群,默认情况下,一个节点会被安排到一个名为“elasticsearch”的集群。确保不要在同一个网络环境中为不同的集群使用同一个名字(跟ES的服务发现机制有关),否则你的节点可能会加入到错误的集群中。例如对于日志服务来说,可以使用log-dev,log-pre, log-prod 来简历不同的集群环境。ES 的集群环境是自动组织的,只需要指定相同的集群名即可。
分片与复制(shards&replicas)
一个索引可以存储大量的数据,甚至超出单个节点的磁盘存储空间。例如一个索引存储了数十亿文档,这些文件占用超过1T的磁盘空间,单台机器无法存储或者由于太多而无法提供搜索服务。在elasticsearch中的默认分片为5片和1个复制。
为了解决这个问题,ES提供了将单个索引分割成多个分片的功能。创建索引时,可以指定任意数量的分片。每个分片都是一个功能齐全且独立的“index”,且可以被托管到集群中的任意节点上。
分片有两个重要作用:
- 提供了容量水平扩展的能力;
- 多个分片允许分布式并发操作,可以大大提高性能;
数据存储在哪个分片和搜索时文档聚合的机制完全由ES负责,这点对于用户来说是透明的。
多租户
elasticsearch中的多租户,其实是通过多索引的机制同时给多个业务场景提供服务。每个业务使用一个索引,通过索引的方式将数据隔离,对每个索引进行参数的单独配置。
restful
简单介绍elasticsearch中的几个常用接口
接口 | 说明 |
---|---|
/_cat/nodes?v | 查看集群状态 |
/_cat/shards?v | 查看分片状态 |
/$ | 搜索 |
- v是verbose的意思。当使用这个参数的时候,结果返回更具有可读性(有表头,有对齐)
- _cat是监控相关的APIS,可以使用/_cat?help来获取所有接口
- ${index}和${type}分别是具体的某一索引或某一类型
elasticsearch基本操作
在开始基本操作之前,首先需要安装elasticsearch和必要的插件。这些操作小编不在这里赘述了,大家可以根据网络上的教程自行安装。可以使用kibana进行索引的操作,在本篇中将利用postman对elasticsearch进行增删改查操作。
增
初始化一个索引
使用PUT方式新增一个elasticsearch索引,在不指定分片和复制时,二者的值分别为5和1。由于本次演示使用一台1核2G的阿里云服务器,指定副本数量为0。使用下面的方式可以创建一个名称为"20200120_xinghaol"的索引。
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 0
}
}
我们通过elasticsearch-head查看,发现已经成功创建一个新的索引。
向索引中添加mappings信息
创建完索引后,需要向index中添加mappings信息,mappings信息定义了elasticsearch中数据存储的数据结构。向索引中添加mappings信息可以在创建索引时就指定mappings的结构信息,也可以在创建完索引后单独添加mappings信息。
创建索引时指定mappings信息,body参数如下所示。在初始化索引时制指定了分片与副本数量,同时指定了mappings信息,type名称为"house",其具有3个field,分别为"house_id"、“house_guid”、“house_name”,并指定了相应的数据类型,是否存储及分析器的类型;
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 0
} ,
"mappings" : {
"house" : {
"properties" : {
"house_id" : {
"type" : "long",
"store" : true
},
"house_guid" : {
"type" : "text",
"store" : true,
"analyzer" : "standard"
},
"house_name" : {
"type" : "text",
"store" : true,
"analyzer" : "standard"
}
}
}
}
}
如果在创建索引未指定mappings信息,也可在后面单独指定mappings的信息,body参数如下所示。请求url中需要指定对应索引中的type,url形式:http://ip:port/${index_name}/${type_name}
{
"properties" : {
"house_id" : {
"type" : "long",
"store" : true
},
"house_guid" : {
"type" : "text",
"store" : true,
"analyzer" : "standard"
},
"house_name" : {
"type" : "text",
"store" : true,
"analyzer" : "standard"
}
}
}
向索引中添加一个文档
向索引中添加文档,使用post方法,url格式为:http://ip:port/ i n d e x n a m e / {index_name}/ indexname/{type}/${id},其中index_name对应了索引的名称,type对应了其类型,id则文档对应的真正的id。使用postman向索引20200120_xinghaol中添加一个文档,body参数如下所示。
{
"house_id" : 300001120,
"house_guid" : "94fd1350-1423-44b4-8bd9-9eece1da9e14",
"house_name" : "小数点价格房屋01"
}
通过elasticsearch-head中的数据浏览可以查看加入的文档数据,如下图所示。
通过上图我们可以查看到刚刚插入的文档数据,但是注意到"_id"字段有字符串和数字两种。这里需要说明的是,在使用url添加文档时,可以不指定其对应的id,这时elasticsearch就会生成一个默认的id,即一个随机字符串。
查
查看索引settings信息
创建索引后,也可以查看索引信息,请求url形式:http://ip:port/${index_name}/_settings,不需要参数,返回值如下所示。结果中包含了索引index的创建时间、分片数量、副本数量、uid、version及名称等信息。
{
"20200120_xinghaol": {
"settings": {
"index": {
"creation_date": "1579510378048",
"number_of_shards": "3",
"number_of_replicas": "0",
"uuid": "n_lZx3i1QPuESDaLEPiDjw",
"version": {
"created": "6060199"
},
"provided_name": "20200120_xinghaol"
}
}
}
}
查看索引的mappings信息
查看索引中的mappings信息,以GET方式请求url形式:http://ip:port/${index_name}/_mappings,得到返回值如下所示。
{
"20200120_xinghaol": {
"mappings": {
"house": {
"properties": {
"house_guid": {
"type": "text",
"store": true,
"analyzer": "standard"
},
"house_id": {
"type": "long",
"store": true
},
"house_name": {
"type": "text",
"store": true,
"analyzer": "standard"
}
}
}
}
}
}
查看索引中的文档
查看索引中添加的文档,使用GET方式请求,请求url形式:http://ip:port/KaTeX parse error: Expected 'EOF', got '#' at position 14: {index_name}/#̲{type_name}/{id},id为elastic中的"_id",得到返回值如下所示。
{
"_index": "20200120_xinghaol",
"_type": "house",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"house_id": 300001122,
"house_guid": "8e57e0b2-85b7-4588-be11-5bd90efacfbd",
"house_name": "人方法"
}
}
改
这里仅介绍修改索引文档操作,使用post方式,请求url形式:http://ip:port/ i n d e x n a m e / {index_name}/ indexname/{type_name}/${id},修改操作时需要指定需要修改的文档id,请求body参数与添加时相同,请求body参数如下所示。
请求url:http://ip:port/20200120_xinghaol/house/1
{
"house_id" : 300001120,
"house_guid" : "94fd1350-1423-44b4-8bd9-9eece1da9e14",
"house_name" : "这是我修改的房屋名称"
}
得到返回值如下所示,根据返回值可以看到操作为update操作,且successful为1,则说明更新操作已经成功。
{
"_index": "20200120_xinghaol",
"_type": "house",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
通过elasticsearch-head查看数据是否已经更改,结果如下,说明已经修改成功。在elasticsearch中的修改操作其实是为先删除后增加。
删
删除操作我们只介绍删除索引,使用delete方式,url请求形式:http://ip:port/${index_name},无需请求参数。返回值如下所示。
{
"acknowledged": true
}
小节
本篇介绍了elasticsearch中的基本概念,并介绍了elasticsearch中的增、删、改、查操作,希望对初学者有所帮助。小编水平有限,敬请谅解,如有错误,请联系小编,互相学习。