一、前言
前篇写了好像没有多少人去看,但是还是要继续,我猜想可能是很多人接触的这块比较少吧,Elasticsearch这块有很多要说的,开始吧。
二、数据库、Elasticsearch选择
传统的数据由于采用的是B+树的索引,当数据量很大很大的时候,例如单表1Y以上的时候当我们在想做like操作的时候,这个是由于like操作会引起全表检索,这个时候非常影响我们查询的效率,当出现这种状况的时候我们就需要考虑下Elasticsearch,没错这就是一个为搜索而生的,Elasticsearch采用的是倒排索引,这里先不要明白什么是倒排索引,下一篇我会比较详细介绍的,这里你有又会问Elasticsearch这么牛逼我们为什么不把它当做持久化DB?这个问题没个人有每个人的看法,只要理由合适就可以,我认为是可以得,但是这里我们要考虑到事务这个特性,传统的数据库是支持ACID,但是在Elasticsearch是不支持的,如果说你的应用不考虑到这点,我支持你使用Elasticsearch作为DB,如果还是要考虑到这些事务的问题,那么我建议你还是将Elasticsearch考虑作为一个搜索和查询展示的工具,这个是我的一些看法,大家有不同意见可以探讨;
三、Elasticsearch介绍
Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch是一个基于Apache Lucene的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。Wikipedia、Stack Overflow、GitHub 等都基于 Elasticsearch 来构建他们的搜索引擎。
四、Elasticsearch相关概念介绍
集群(Cluster)
一个集群包含一个或多个节点,用来保存全部数据,并且这些节点联合提供索引和搜索能力。集群使用唯一名称进行不同集群间的区分,默认名称是”elasticsearch”。
节点(Node)
一个Elasticsearch运行实例,是集群的构成单元。集群中的节点,也有唯一标识的,默认在节点启动的时候会随机指定一个UUID。如果不使用默认名称,可以为其指定一个名称,当想要加入某个集群的时候也必须要指定集群的名称;接下来我们还要介绍下节点的类型:
候选主节点(Master-eligible node)
一个节点启动后,就会使用Zen Discovery机制去寻找集群中的其他节点,并与之建立连接。集群中会从候选主节点中选举出一个主节点,主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作。正常情况下,一个集群中只有一个选举出来的主节点,当主节点由于网络或者负载过大停止响应,此时就需要重新选举主节点,这时可能会出现集群中有多个主节点的现象,即节点对集群状态的认知不一致,称之为脑裂现象。这也就是为什么候选主节点要为单数的情况的原因;这里我建议候选主节点不要存放数据,配置如下:
node.master = true node.data = false
数据节点(Data node)
数据节点主要存放索引相关数据的分片,负责数据的存储和相关具体操作,比如CRUD、搜索、聚合等。
node.master = false node.data = true
主要介绍这来两种,剩下的大家参考官方文档;
索引(index)
索引就是相当于Mysql里的Database,存储文档结构相同的类型的集合;
文档(documnet)
文档是索引的基础信息单元,相当于Mysql中的行,文档与JSON的形式表现,
Document MetaData(元数据)
1._index:文档所在的索引名,多索引查询时,有时候只需要在特地索引名上进行查询,_index字段提供了便利。_index是一个虚拟字段,不会真的加到Lucene索引中。
2._type:文档所在的类型名,可以根据_type进行查询、聚合、脚本和排序。
3._id: 文档唯一 id;
4._uid: 组合id,由_type 和_id 组成;
5._source:文档的原始Json数据,可以从这里获取每个字段的内容。默认_source字段是开启的,也可以关闭:
6._all: 字段拼接在一起,将所有的字段用空格分开,_all字段会被解析和索引,但是不存储。当你只想返回包含某个关键字的文档但是不明确地搜某个字段的时候就需要使用_all字段。 默认禁用;
7._parent:指定同一索引中文档的父子关系;
8._routing:_routing值是文档的_id或者_parent,通过_routing参数可以设置自定义路由;
类型(type)
索引中可以定义一种或多种类型。类型是索引的一个逻辑上的分类;
字段(field)
字段是Elasticsearch里面最小的单元,相当于Mysql的列,类似于JSON中的一个键,字段类型:
字符串: text keyword(不分词);
数值类型: long integer short(-32,768至32768) byte(-128至127) double float half_float(16位半精度) scaled_float缩放类型的的浮点数(比如价格只需要精确到分,price为88.88的字段缩放因子为100,存起来就是8888);
布尔型: boolean;
日期: date;
二进制: binary;
范围类型: integer_range float_range long_range double_range date_range;
分片(shards)
Elasticsearch将索引分成若干份,默认是5个分片,每个部分是一个分片,每个分片存在不同节点上,一个节点不能存在相同的分片,每个文档通过文档id进行Hash决定放到那个节点上,每个分片都是一个独立的Lucene实例;
副本(replicas)
索引的一份或者多份拷贝,默认是1份,主要作用是容灾作用,防止分片丢失后,副本分片会成为主分片,保证数据不会丢失,另外提升查询性能;
五、下节预告
下次一篇介绍索引的创建、查询原理、分词器等,欢迎点赞,欢迎加群438836709,欢迎关注公众号: