Elasticsearch 介绍
结合官方文档介绍
- Elasticsearch是一个基于Apache Lucene的开源搜索引擎。ES不仅包括了全文搜索功能,还拥有分布式搜索的功能。当然,ES虽然是基于Lucene开发,但相对于Lucene复杂程度,ES提供了简单的RESTful API用来隐藏Lucene的复杂性,使得ES操作变得简单很多。
- ES的功能:
- 兼容了Lucene和全文搜索的功能。
- 拥有分布式的实时文件存储的功能,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
- 而且,所有的这些功能被集成到一个服务里面,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。
- 上手Elasticsearch非常容易。它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它开箱即用(安装即可使用),只需很少的学习既可在生产环境中使用。
以上总结:ES是基于Lucene的开源搜索引擎,它封装了RESTful API简化了操作,容易上手。兼容了全文搜索的功能,添加了分布式的存储及搜索功能,可扩展到上百台服务器处理PB级数据。
参考文章:
Elasticsearch权威指南(中文版)
Lucene、Solr、Elasticsearch的区别
Lucene是一个开放源代码的全文检索引擎工具包,提供了完整的查询引擎和索引引擎。Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。Lucene在搜索引擎的领域就相当于Spring框架一般,是Solr和ES的前身。
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,它对外提供类似于Web-service的API接口。相当于Lucene的扩展版。而且,Solr与Lucene最大的区别便是Solr是一个独立的应用程序。
ES则是作为分布式搜索引擎的使用,提供了分布式的解决方案,对处理的数据量进行了扩展,可达到亿级数据的搜索。
Solr与ES对比
特征 | Solr/SolrCloud | Elasticsearch |
---|---|---|
社区和开发者 | Apache 软件基金和社区支持 | 单一商业实体及其员工 |
节点发现 | Apache Zookeeper,在大量项目中成熟且经过实战测试 | Zen内置于Elasticsearch本身,需要专用的主节点才能进行分裂脑保护 |
碎片放置 | 本质上是静态,需要手动工作来迁移分片,从Solr 7开始 - Autoscaling API允许一些动态操作 | 动态,可以根据群集状态按需移动分片 |
高速缓存 | 全局,每个段更改无效 | 每段,更适合动态更改数据 |
分析引擎性能 | 非常适合精确计算的静态数据 | 结果的准确性取决于数据放置 |
全文搜索功能 | 基于Lucene的语言分析,多建议,拼写检查,丰富的高亮显示支持 | 基于Lucene的语言分析,单一建议API实现,高亮显示重新计算 |
DevOps支持 | 尚未完全,但即将到来 | 非常好的API |
非平面数据处理 | 嵌套文档和父-子支持 | 嵌套和对象类型的自然支持允许几乎无限的嵌套和父-子支持 |
查询DSL | JSON(有限),XML(有限)或URL参数 | JSON |
索引/收集领导控制 | 领导者安置控制和领导者重新平衡甚至可以节点上的负载 | 不可能 |
机器学习 | 内置 - 在流聚合之上,专注于逻辑回归和学习排名贡献模块 | 商业功能,专注于异常和异常值以及时间序列数据 |
以上总结:Solr是Lucene面向于企业搜索的扩展,是一个独立的应用程序,相对ES更加成熟;ES是Lucene分布式搜索的扩展,是针对于分布式亿级数据量的搜索引擎。
参考文章:
全文搜索引擎 ElasticSearch 还是 Solr? and
Lucene 和solr的区别
推荐文章:
全文索引Elasticsearch,Solr,Lucene
基本类型
ES的存储类型以JSON格式为主。
例如:
{
"name" : "xiaoming",
"sex" : "man",
"age" : 18,
"birthDate": "2001/05/01"
}
在搜索时,传入对应的RESTful风格的JSON进行搜索。
搜索实例:
POST _search
{
"name" : "ming"
}
更多语法:
Elasticsearch入门教程
索引
取舍
首先,我们需要知道ES采用的索引是倒排索引,相对于B-Tree索引,在查询速度上提升了很多。当然,有取必有舍,倒排索引虽然提高了搜索的性能,却牺牲了其他的一些性能,例如插入与更新。
B-Tree索引与倒排索引
B-Tree
B-Tree作为一个常用的数据结构,是由二叉树到红黑树再到B-Tree发展而来。二叉树的查询效果是logN,在插入新节点时不用移动全部节点,所以能同时兼容插入与查询的性能。传统的关系型数据库便是在这个基础上结合了磁盘的顺序读/随机读的特性,以B-Tree/B+Tree作为数据结构的:
倒排索引
倒排索引,举例说,它就如同一个字典。在我们查某个汉字的时候,首先我们会去查这个字母的首字母,然后再去找这个字的全拼,最后就可以得到这个全拼在字典中的位置都有哪些了。前人智慧令人拜服,这样查询的速度也许在一本新华字典中看不出来多少的效率,但若是上亿条数据呢?
首先,我们来了解一下倒排索引的构成:
我们需要一张实例表:
name | age | sex |
---|---|---|
xiaoming | 18 | man |
xiaohong | 17 | woman |
xiaoli | 17 | man |
-
Posting List
posting list就是一个int类型的数组,它会为存入的JSON格式的序号。如实例表中,posting list会为每条数据加入一个自建id,就如同字典的目录一样,示例如下:
name
trem posting list xiaoming 1 xiaohong 2 xiaoli 3 age
trem posting list 18 1 17 [2,3] sex
trem posting list man [1,3] woman 2 综上表展示,我们发现针对于数据每个字段的不同值,posting list都为我们做好了筛选。但 如果是上万条数据呢?而且我们需要查询的还是name呢?
所以,我们还需要结合其他的数据结构一起处理这方面的问题。 -
Trem Index
B-Tree通过减少磁盘的遍历次数来提高查询效率,ES对于这样大大提升查询速度的数据结构怎么可能不引入呢?但是,相对于B-Tree不同的是,ES查询查询的数据量是特别大的,这样一来trem就会特别多,term dictionary也会相对的特别大,那么,B-Tree这种通过内存查询的思路显然便成了不可取的了。
于是ES便相对的出现了Trem Index,正是我们上面所说的字典目录了:
-
FST压缩技巧
距离来说,如果我们需要存储一个Map集合的数据,那么它最简单的定义将是Map<String,intager="">,那如果从占用内存的角度去想,节省更多的内存就需要用到FST压缩技术了。
首先,举例来说,我们的Map中有70,73,80,205,223,103这几个值,为了提高搜索效率,FST对其进行了压缩,变成了73,3,7,125,18,-120。规律便是采用了递增,只需要保存递增值即可。之后,再精打细算通过bit排队存储,为何精打细算?就是为了避免例如有如上例子中的3这个值也要存储int(4字节)的浪费。
-
Roaring bitmaps
Roaring bitmaps是由数据结构bitmap发展而来。举例来说,有个posting list:
[1,2,3,5,7,10]
它对应的bitmaps便是:
[1,1,1,0,1,0,1,0,0,1]
通过观察,我们可以简单的发现这个数据结构递增的规律。但是,bitmaps的缺点是存储空间会随着文档个数线性增长,但Roaring bitmaps打破了这一点。
如上图,Roaring bitmaps采用2字节的最大数65535(2^16-1)为范围,以<商,余数>的结构对数据进行存储。
-
联合索引中的倒排
如果是联合索引,则利用跳表的数据结构快速做‘与’运算。
ES的安装
-
首先,去ES官网下载安装包:ES官网下载
或者在Linux中直接使用命令:wget https://artifacts.elastic.co/downloads/elasticsearch/ elasticsearch-6.0.0.tar.gz
-
之后的Linux操作:
#创建文件夹 mkdir elasticsearch #移动安装包 mv elasticsearch-6.0.0.tar.gz /elasticsearch #解压 tar -zxvf elasticsearch-6.0.0.tar.gz
ES目录(仅了解):
bin/ config/ //ES配置文件的目录 lib/ //依赖的第三方库的目录 LICENSE.txt modules/ //模块目录 NOTICE.txt plugins/ //第三方插件的目录 README.textile
*确保有JDK1.8环境,这点很重要。另外,使用Oracle JDK的注意Oracle有认证,建议先下载安装包再解压。
-
执行:
sh ./ bin/elasticsearch
-
在浏览器输入
127.0.0.1:9200
推荐文章:ES 入门之一 安装ElasticSearcha
该作者ES入门笔记:ElasticSearch 入门笔记
集群安装
-
配置Linux环境
vim /etc/security/limits.conf * soft nofile 65536 * hard nofile 65536 vim /etc/sysctl.conf vm.max_map_count=262144 sysctl -p vi /etc/security/limits.d/90-nproc.conf 1024-2048
-
修改es配置elasticsearch.yml
cluster.name: my-application node.name: node-1 path.data: /var/elasticsearch/data path.logs: /var/elasticsearch/logs network.host: 192.168.2.200 http.port: 9200 discovery.zen.ping.multicast.enabled: false discovery.zen.fd.ping_timeout: 100s discovery.zen.ping.timeout: 100s discovery.zen.minimum_master_nodes: 2 discovery.zen.ping.unicast.hosts: ["192.168.2.200"] http.host: 192.168.2.200 http.cors.enabled: true http.cors.allow-origin: "*"
ps:集群相关的两个配置,network.host和discovery.zen.ping.unicast.hosts。es本身就支持集群,配置这两个配置后就实现了集群
参考文章:es安装和应用
*该篇文章写有kibana和IK分词的安装和扩展哦,膜拜了。SpringBoot整合ES
首先,我们先要了解SpringBoot与ES的对应版本
Spring Boot Version (x) Spring Data Elasticsearch Version (y) Elasticsearch Version (z) x <= 1.3.5 y <= 1.3.4 z <= 1.7.2* x >= 1.4.x 2.0.0 <=y < 5.0.0** 2.0.0 <= z < 5.0.0** 所以,我们需要注意的便是SpringBoot与ES的版本,不要因为版本报错找不到原因哦。
-
添加依赖
<!--ElasticSearch--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <!--需要引入transport-netty3-client,否则会启动报错--> <dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId>transport-netty3-client</artifactId> <version>5.6.10</version> </dependency>
-
在yml脚本或properties脚本中修改配置
#Es地址 es.hostName=localhost #Es端口号 es.transport=9300 #配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段 下有多个集群,就可以用这个属性来区分不同的集群 es.cluster.name=elasticsearch
-
添加配置类
import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import java.net.InetAddress; import java.net.UnknownHostException; /** * @Author Conn * @Date 2018/10/15 */ @Configuration @PropertySource(value = "classpath:config/elasticsearch.properties") public class ElasticSearchConfig { private static final Logger logger = LoggerFactory.getLogger(ElasticSearchConfig.class); @Value("${es.hostName}") private String hostName; @Value("${es.transport}") private Integer transport; @Value("${es.cluster.name}") private String clusterName; @Bean public TransportClient transportClient() { logger.info("ElasticSearch初始化开始"); TransportClient transportClient = null; try { TransportAddress transportAddress = new InetSocketTransportAddress(InetAddress.getByName(hostName), Integer.valueOf(transport)); //配置信息 Settings es = Settings.builder().put("cluster.name", clusterName).build(); //配置信息Settings自定义 transportClient = new PreBuiltTransportClient(es); transportClient.addTransportAddress(transportAddress); } catch (UnknownHostException e) { logger.error("ES创建错误", e); } return transportClient; } }
参考文章:
SpringBoot整合ElasticSearch详细过程
SpringBoot整合ElasticSearch实现多版本的兼容另外推荐:
Elasticsearch实战篇——Spring Boot整合ElasticSearch
Elasticsearch 基础理论 & 配置调优
大佬写的高级ES入门以上便是所有的ES讲解了,如果有不对的地方或者需要补充的地方欢迎大家留言。
-