elasticsearch系列--elasticsearch基础

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中的数据浏览可以查看加入的文档数据,如下图所示。
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中的修改操作其实是为先删除后增加。
修改elasticsearch文档内容

删除操作我们只介绍删除索引,使用delete方式,url请求形式:http://ip:port/${index_name},无需请求参数。返回值如下所示。

{
    "acknowledged": true
}

小节

本篇介绍了elasticsearch中的基本概念,并介绍了elasticsearch中的增、删、改、查操作,希望对初学者有所帮助。小编水平有限,敬请谅解,如有错误,请联系小编,互相学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值