ElasticSearch 从0到1

目录

一、简介

二、ElasticSearch 的使用案例

三、ElasticSearch  与 Solr 的区别

四、安装 Elasticsearch【Windows】

五、Elasticsearch 核心概念

六、ElasticSearch 索引库操作

七、ElasticSearch 文档操作

八、分词器


一、简介


ElasticSearch 简称 es,Elasticsearch是一个开源的高扩展的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。它几乎可以实时的存储,检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据,es 也可以使用 Java 开发并使用 Lucene作为核心来实现所有索引和搜索功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库。无论是开源还是私有,但它也仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理,因为Lucene 非常复杂。为了解决 Lucene使用时的繁复性,于是 ElasticSearch便应运而生。它使用 Java 编写,内部采用 Lucene 做索引与搜索,但是它的目标是使全文检索变得更简单,简单来说,就是对 Lucene 做了一层封装,它提供了一套简单一致的 RESTful API 来帮助我们实现存储和检索。当然,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。它可以被下面这样准确地形容:现在,ElasticSearch已成为全文搜索领域的主流软件之一。
  ●  一个分布式的实时文档存储,每个字段可以被索引与搜索;
  ●  一个分布式实时分析搜索引擎;
  ●  能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。

二、ElasticSearch 的使用案例


【1】2013 年初,GitHub 抛弃了 Solr,采用了 ElasticSearch  来做 PB级的搜索。“GitHub”使用了 ElasticSearch 搜索 20TB的数据,包括 13亿文件和1300亿代码;
【2】维基百科:启动以 ElasticSearch  为基础的核心搜索架构;
【3】SoundCloud使用 ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务;
【4】百度目前广泛使用 ElasticSearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维度分析展示,辅助定位分析实例异常或业务层面异常,目前覆盖百度内部20多个业务线,单集群最大 100台机器,200个ES节点,每天导入30TB+数据;
【5】新浪使用ES分析处理32亿条实时日志;
【6】阿里使用ES构建自己的日志采集和分析体系;

三、ElasticSearch  与 Solr 的区别


【1】Solr 利用 Zookeeper 进行分布式管理,而 ElasticSearch自身带有分布式协调管理功能;
【2】Solr 支持更多格式的数据,而 ElasticSearch仅支持 JSON 格式的数据;
【3】Solr 官方提供的功能更多,而 ElasticSearch本身更注重于核心功能,高级功能多数由第三方插件提供;
【4】Solr 在传统的搜索应用中表现好于 ElasticSearch,但是在处理实时搜索应用的效率明显低于 ElasticSearch;

四、安装 Elasticsearch【Windows】


安装 Elasticsearch之前,你需要先安装一个较新版本的 Java【我JDK1.8,ES下载的5.6.9】。然后从 ES的官网 elastic.co/downloads/elasticsearch 获取最新版本的 Elasticsearch。解压文档后,进入安装目录执行如下命令:Linux 版本不能使用root用户启动,问题比较多,我使用的 Windowns,运行 elasticsearch.bat

./bin/elasticsearch

此时,Elasticsearch运行在本地的 9200端口,在浏览器中输入网址“http://localhost:9200/”,如果看到以下信息就说明你的电脑已成功安装Elasticsearch:

elasticsearch-head 是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。elasticsearch-head 插件的安装在 Linux 和 Windows 没什么区别,安装之前确保当前系统已经安装 nodejs 即可。
【1】进入github,下载 elasticsearch-head ZIP 文件。下载链接
【2】将其下载并解压到本地,进入 elasticsearch-head目录中,执行如下命令安装并启动:注意 npm命令需要安装node.js。

cd elasticsearch-head
npm install
npm run start

【3】运行npm run start,启动 head插件。
【4】配置 config/elasticsearch.yml 文件,文件末尾插入如下代码:解决跨域访问问题

#allow origin
http.cors.enabled: true
http.cors.allow-origin: "*"

【5】然后可以在浏览器直接看到如下效果:需要重启 Elasticsearch。因为我是单点的,所以健康度直接是yellow,黄色不影响使用,红色就有问题了,不过具体看问题是什么问题。
 

五、Elasticsearch 核心概念


Elasticsearch 是面向文档的(document oriented)的,这意味着他可以存储整个文档(document),然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在 Elasticsearch 中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。Elasticsearch 比传统关系型数据库如下:

Relational DB -> Databases -> Tables -> Rows      -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

【1】索引 Index:一个索引就是一个拥有几份相似特征的文档的集合,比如说,那你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引,一个索引由一个名字来标识(必须全部是小写字母),并且当我们对对应索引中的文档进行进行索引、搜索、更新和删除的时候,都要使用到这个名字,在一个集群中,可以定义任意多的索引。
【2】类型 Type:在一个索引中,你可以定义一种或多种类型,一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定,通常,会为具有一组共同字段的文档定义一个类型,比如说:我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中,在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,也可以为评论数据定义另一个类型。
【3】文档 Document:一个文档是一个可被索引的基础信息单元,比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档,文档以JSON格式来表示,而 JSON是一个到处存在的互联网交互格式。
【4】字段 Field:相当于是数据表中的字段,对文档数据根据不同属性进行的分类标识。
【5】映射 Mapping:mapping 是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面设置的,其它就是处理 es里面数据的一些使用规则设置也叫映射,按照最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要考虑如何映射才能对性能更好。
【6】接近实时 NRT:Elasticsearch 是一个接近实时的搜索平台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常在1s内)。
【7】节点 & 集群(Node & Cluster):Elasticsearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个Elasticsearch实例。单个Elasticsearch实例称为一个节点(Node),一组节点构成一个集群(Cluster)。一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于Elasticsearch集群中的哪些节点。在产品环境中显式地设定这个名字是一个好习。
【8】分片和复制(shards & replicas):一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,ElasticSearch提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。 分片之所以重要,主要有两方面的原因:
  ■  允许你水平分割/扩展你的内容容量;
  ■  允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量;
至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由ElasticSearch管理的,对于作为用户的你来说,这些都是透明的。在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了。这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。复制之所以重要,主要有两方面的原因:
  ■  在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的;
  ■  扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行;
总之,每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制数量,但是不能改变分片的数量
默认情况下,ElasticSearch中的每个索引被分片5个主分片和1个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。一个索引的多个分片可以存放在集群中的一台主机上,也可以存放在多台主机上,这取决于你的集群机器数量。主分片和复制分片的具体位置是由ES内在的策略所决定的。
【9】文档元数据 Document metadata:文档元数据为_index, _type, _id, 这三者可以唯一表示一个文档,_index表示文档在哪存放,_type表示文档的对象类别,_id为文档的唯一标识。

六、ElasticSearch 索引库操作


【1】创建索引库:我使用的 postman 发送的 PUT请求来创建索引,并使用 ES-head 查看索引信息。
 
mappings 信息如下

{
	"mappings": {
		"article": {
			"properties": {
				"id": {
					"type": "long",
					"store": true,
					"index": "not_analyzed"
				},
				"title": {
					"type": "text",
					"store": true,
					"index": "analyzed",
					"analyzer": "standard"
				},
				"content": {
					"type": "text",
					"store": true,
					"index": "analyzed",
					"analyzer": "standard"
				}
			}
		}
	}
}

【刷新ES-head 发现 blog 索引创建信息】
 
【点击“信息”—>"索引信息"】
 
【2】为创建的索引设置 mappings(如果创建索引的时候没有设置 mappings 参数):POST请求
 
【点击“信息”—>"索引信息"】
 
【2】删除索引库:我喜欢直接在es-head 删除,点击 “动作”->“删除” 然后输入“删除”即可。
 
【使用 postman 发送请求的方式删除索引库】
 

七、ElasticSearch 文档操作


【1】创建文档 document:
 
查看数据】:_id 是文档的真正id

【2】删除文档 document:根据 id进行删除,如下请求为 Delete,url跟put是一致的。

【3】修改文档 document:本质跟Lucene 是一样的,底层都是先删除再添加。

查看数据

【4】查询:根据 Document的ID 查询
 
【4】查询:根据关键词进行查询
 
【4】查询:querystring 查询,会先分词 [“修”、“完”] 再查询
 
【4】查询:通过 head 插件进行查询。可以指定query_string 等条件,进行查询
 

八、分词器


【1】查看分词器分词后的结果
 
【2】安装 IK 分词器:下载地址 选择自己的版本下载后进行解压缩,进入解压后的目录,编译代码  mvn clean  package;编译完成之后会在 target\releases 生成 elasticsearch-analysis-ik-*.zip 文件。将解压后的文件放入 elasticsearch/plugins 的目录下,并重启IK即可。IK 提供两种算法:ik_smart 最少切分ik_max_word 最细粒度划分。
【ik_smart 分词效果】

 
【ik_max_word 分词效果】
 


----关注公众号,获取更多内容----

猜你喜欢

转载自blog.csdn.net/zhengzhaoyang122/article/details/105917316