一.什么是Elasticsearch?
Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单.
ElasticSearch对比solr?
Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch
二.启动与安装
1、下载ElasticSearch的安装包
https://www.elastic.co/products/elasticsearch
2、安装ElasticSearch服务
解压即安装完毕
3、启动ElasticSearch服务
点击ElasticSearch下的bin目录下的elasticsearch.bat启动服务
然后访问 http://localhost:9200/
当ElasticSearch的节点启动后,它会利用多播(multicast,一种网络广播方式)寻找集群中的其它节点,并与之建立连接。
发现机制?
Zen 发现机制是ElasticSearch中默认的用来发现新节点的功能模块,而且集群启动后默认生效。Zen发现机制默认配置是用多播来寻找其它的节点。对于用户而言,这是一极其省事的解决方案:只需启动新的ElasticSearch节点即可,如果各个模块工作正常,该节点就会自动添加到与节点中集群名字(cluster.name)一样的集群,同时其它的节点都能感知到新节点的加入。如果节点添加不进去,你就应该检查节点的publish_host属性或者host属性的设置,来确保ElasticSearch在监听合适的网络端口。
在比较大的集群中,多播发现机制可能会产生太多不必要的流量开销,这是不使用多播的一个充分理由。在这种情况下,Zen发现机制引入了第二种发现节点的方法:单播模式。
4、安装ElasticSearch的图形化界面插件
4.1、安装图形化界面head插件
解压elasticsearch‐head‐master.zip到任意目录
4.2、安装nodejs程序
Grunt和所有grunt插件都是基于nodejs来运行的
4.3、grunt安装为全局命令
Grunt是一个基于JavaScript上的一个很强大的前端自动化工具基于NodeJS用于自动化构建、 测 试、生成文档的项目管理工具。 cmd控制台中输入: npm install ‐g grunt‐cli
4.4、设置允许elasticsearch跨越访问
#修改elasticsearch‐5.6.8\config下的elasticsearch.yml文件: # 开启跨域访问支持,默认为false http.cors.enabled: true # 跨域访问允许的域名地址 http.cors.allow-origin: "*"
4.5、cmd命令进入elasticsearch-head-master目录,启动head图形化界面程序:
grunt server
如果grunt server不好用:
cmd进入到head目录中执行npm install 然后再执行 grunt server
4.6、测试查询
http://localhost:9100
4.7、注意:
*使用java代码通过 9300 访问Es服务器
*使用浏览器通过 9200
三、ElasticSearch的核心概念
1、概述
ElasticSearch是面向文档(document)的,意味着他可以存储整个对象或者文档,还会对文档的内容进行索引的创建,使文档可以被搜索到。
2、核心概念
2.1、接近实时的NRT
ES是一个近实时的搜索平台,也就是索引一个文档到这个文档能被搜索到会有轻微延迟(通常为1秒)。 索引会先写入内存,然后在写入磁盘。
2.2、集群 cluster
一个集群就是由一个或多个节点组织在一起,他们共同持有整个数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticSearch”。集群的名字很重要,集群内的节点只能通过制定集群的名字来加入集群。
2.3、节点 node(相当于数据库服务器)
1、一个节点就是集群中的一个服务器,作为集群的一部分,节点存储数据,参与集群的索引和搜索功能。一个节点是由一个【节点名】来标识的,节点名一个随机字符串。默认情况下,节点名是由ElasticSearch服务在节点第一次启动的时候随机生成,之后这个节点就会一直使用这个节点名。 2、节点通过配置集群名字来加入集群,默认情况下,节点会寻找集群名为“elasticSearch”的集群中。意味着:如果同一网络中启动了若干个节点,并且没有修改默认配置,那么这些节点可以互相发现彼此,并形成一个叫做“elasticSearch”的集群 当网络中只有一个节点时,会默认创建并加入“elasticSearch”的集群 当然节点加入的集群名可以在节点的配置文件中进行修改
2.4、索引 index (相当于库) 名词
1、一个索引实际上是一个“逻辑命名空间”,是文档的集合。一个索引由索引名字来标识,名字必须【小写字母】。我们在进行文档的索引(动词)、搜索、更新、删除的时候,都要用索引名。在一个集群中,可以定义多个索引 2、索引存储在多个分片中,其中每一个分片都是一个独立的 Lucene Index。这就应该能提醒你,添加新 index 应该有个限度:每个 Lucene Index 都需要消耗一些磁盘,内存和文件描述符。因此,一个大的 index 比多个小 index 效率更高:Lucene Index 的固定开销被摊分到更多文档上了 3、在搜索时,每个分片都需要搜索一次, 然后 ES 会合并来自所有分片的结果。例如,你要搜索 10 个 index,每个 index 有 5 个分片,那么协调这次搜索的节点就需要合并 5x10=50 个分片的结果。这也是一个你需要注意的地方:如果有太多分片的结果需要合并,或者你发起了一个结果巨大的搜索请求,合并任务会需要大量 CPU 和内存资源。
2.5、类型 type (相当于表)
在一个索引中,可以定义多个类型。类型是对文档的逻辑分类 在ElasticSearch5.X的版本中支持一个索引下有多个type
2.6、文档 document (相当于一条数据)
文档是ElasticSearch的基本单位。在Es中文档以JSON格式来表示
2.7、属性 field (相当于字段)
字段是文档中的属性,需要对每一个属性定义索引和被搜索的方式
2.7.1、数据类型:
字符串类型:string;text 数值类型:字节(byte)、2字节(short)、4字节(integer)、8字节(long)、float、double; 布尔类型:boolean,值是true或false; 时间/日期类型:date,用于存储日期和时间; 二进制类型:binary; IP地址类型:ip,以字符串形式存储IPv4地址; 特殊数据类型:token_count,用于存储索引的字数信息
2.7.2、公共属性:
index:该属性控制字段是否编入索引被搜索,该属性共有三个有效值:analyzed、no和not_analyzed: analyzed:表示该字段被分析,编入索引,产生的token能被搜索到; not_analyzed:表示该字段不会被分析,使用原始值编入索引,在索引中作为单个词; no:不编入索引,无法搜索该字段; 其中analyzed是分析,分解的意思,默认值是analyzed,表示将该字段编入索引,以供搜索。 store:指定是否将字段的原始值写入索引,默认值是no,字段值被分析,能够被搜索,但是,字段值不会存储, 这意味着,该字段能够被查询,但是不会存储字段的原始值。 boost:字段级别的助推,默认值是1,定义了字段在文档中的重要性/权重; include_in_all:该属性指定当前字段是否包括在_all字段中,默认值是ture,所有的字段都会包含_all字段 中;如果index=no,那么属性include_in_all无效,这意味着当前字段无法包含在_all字段中。 copy_to:该属性指定一个字段名称,ElasticSearch引擎将当前字段的值复制到该属性指定的字段中; doc_values:文档值是存储在硬盘上的索引时(indexing time)数据结构,对于not_analyzed字段,默认值 是true,analyzed string字段不支持文档值; fielddata:字段数据是存储在内存中的查询时(querying time)数据结构,只支持analyzed string字段; null_value:该属性指定一个值,当字段的值为NULL时,该字段使用null_value代替NULL值;在ElasticSearch中,NULL 值不能被索引和搜索,当一个字段设置为NULL值,ElasticSearch引擎认为该字段没 有任何值,使用该属性为NULL字段设置一个指定的值,使该字段能够被索引和搜索。
2.8、分片 和 复制
2.8.1、概念与作用
分片:就是把索引数据切分成多个小的索引块,这些小的索引块能够分发到同一个集群中的不同节点。
ElasticSearch集群通过把数据分发到多个存储Lucene索引的物理机上,达到能够存储超出单机容量的信息这一目的。这个分发的过程称为索引分片(Sharding)。在ElasticSearch集群中,索引分片(Sharding)是自动完成的,而且所有分片索引(Shard)是作为一个整体呈现给用户的。
整体呈现可以这样理解:当你查询的索引分布在多个分片上时, Elasticsearch会把查询发送给每个相关的分片,并将结果【合并】在一起,而应用程序并不知道分片的存在。 索引数据的操作只会发生在主分片上(primary shard)上,不会发生在分片的副本上。
Elasticsearch索引是由一个或多个分片组成的,每个分片包含了文档集的一部分。采用Elasticsearch默认设置时,索引结束后将得到5个分片及对应的副本。“副本”(replica)意味着每一个分片都有自己的分片副本(copy),所以实际上有5个分片和5个相应分片副本。
2.8.2、选择合适的分片数
如果数据集的大小有限制而且严格定义好的,可以只使用一个分片。如果不是的,大拇指法则表明最佳的分片数量取决于节点数量。所以,如果计划将会到10个节点,那么就需要配置10个分片。需要记住的重点是:考虑到高可用性和吞吐量,分片副本也是需要声配置的。分片副本像普通分片一样也占用空间。如果为每个分片指定一个拷贝(number_of_shards =1 ),那么就需要20个分片:10个主分片和10个分片副本。这个简单的公式可以总结如下: Max number of nodes = Number of shards * (number of replicas +1) 换句话说,如果你计划用10个分片和2个分片副本,那么最大的节点数是30。
2.9、mapping映射
mapping定义了文档中的每一个field如何被索引和被查询到