分享

Elasticsearch学习与使用【面试+工作】

 Java帮帮 2020-01-02


Elasticsearch简介

一、什么是Elasticsearch

Elasticsearch (ES)是一个基于 Lucene 的开源搜索引擎,它不但稳定、可靠、快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的,Elasticsearch是面向文档型数据库,这意味着它存储的是整个对象或者文档,它不但会存储它们,还会为他们建立索引,这样你就可以搜索他们了。你可以在 Elasticsearch 中索引、搜索、排序和过滤这些文档,不需要成行成列的数据,ElasticSearch 提供了一套基于restful风格的全文检索服务组件。前身是compass,直到2010被一家公司接管进行维护,开始商业化,并提供了ElasticSearch 一些相关的产品,包括大家比较熟悉的 kibana、logstash 以及 ElasticSearch 的一些组件,比如安全组件shield 。当前最新的ElasticSearch 版本为 5.5.1 ,比较应用广泛的为2.X,直到 2016-12 推出了5.x 版本 ,将版本号调为 5.X 。这是为了和 kibana 和 logstash 等产品版本号进行统一 ElasticSearch 。

1.1、Elasticsearch特性

1.安装方便:没有其他依赖,下载后安装非常方便;只用修改几个参数就可以搭建起来一个集群

2.JSON:输入/输出格式为 JSON,不需要定义 Schema,快捷方便
3.RESTful:基本所有操作(索引、查询、甚至是配置)都可以通过 HTTP 接口进行
4.分布式:节点对外表现对等(每个节点都可以用来做入口);加入节点自动均衡
5.多租户:可根据不同的用途分索引;可以同时操作多个索引
6.准实时:从文档索引到可以被检索只有轻微延时,约1s

7.支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。

Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作:

1.分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
2.实时分析的分布式搜索引擎。
3.可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
4.这么多的功能被集成到一台服务器上,你可以轻松地通过客户端或者任何你喜欢的程序语言与ES的RESTful API进行交流。

1.2、ElasticSearch相关概念

下图是 Elasticsearch 插件 head 的一个截图

● node:即一个 Elasticsearch 的运行实例,使用多播或单播方式发现 cluster 并加入。
● cluster:包含一个或多个拥有相同集群名称的 node,其中包含一个master node。
● index:类比关系型数据库里的DB,是一个逻辑命名空间。
● alias:可以给 index 添加零个或多个alias,通过 alias 使用index 和根据index name 访问index一样,但是,alias给我们提供了一种切换index的能力,比如重建了index,取名● customer_online_v2,这时,有了alias,我要访问新 index,只需要把 alias 添加到新 index 即可,并把alias从旧的 index 删除。不用修改代码。
● type:类比关系数据库里的Table。其中,一个index可以定义多个type,但一般使用习惯仅配一个type。
● mapping:类比关系型数据库中的 schema 概念,mapping 定义了 index 中的 type。mapping 可以显示的定义,也可以在 document 被索引时自动生成,如果有新的 field,Elasticsearch 会自动推测出 field 的type并加到mapping中。
● document:类比关系数据库里的一行记录(record),document 是 Elasticsearch 里的一个 JSON 对象,包括零个或多个field。
● field:类比关系数据库里的field,每个field 都有自己的字段类型。
● shard:是一个Lucene 实例。Elasticsearch 基于 Lucene,shard 是一个 Lucene 实例,被 Elasticsearch 自动管理。之前提到,index 是一个逻辑命名空间,shard 是具体的物理概念,建索引、查询等都是具体的shard在工作。shard 包括primary shard 和 replica shard,写数据时,先写到primary shard,然后,同步到replica shard,查询时,primary 和 replica 充当相同的作用。replica shard 可以有多份,也可以没有,replica shard的存在有两个作用,一是容灾,如果primary shard 挂了,数据也不会丢失,集群仍然能正常工作;二是提高性能,因为replica 和 primary shard 都能处理查询。另外,如上图右侧红框所示,shard数和replica数都可以设置,但是,shard 数只能在建立index 时设置,后期不能更改,但是,replica 数可以随时更改。但是,由于 Elasticsearch 很友好的封装了这部分,在使用Elasticsearch 的过程中,我们一般仅需要关注 index 即可,不需关注shard。

综上所述,shard、node、cluster 在物理上构成了 Elasticsearch 集群,field、type、index 在逻辑上构成一个index的基本概念,在使用 Elasticsearch 过程中,我们一般关注到逻辑概念就好,就像我们在使用MySQL 时,我们一般就关注DB Name、Table和schema即可,而不会关注DBA维护了几个MySQL实例、master 和 slave 等怎么部署的一样。

要了解ES首先就要弄清楚下面的几个概念,这样也不会对ES产生一些误解:

1 近实时

ES并不是一个标准的数据库,它不像MongoDB,它侧重于对存储的数据进行搜索。因此要注意到它 不是 实时读写 的,这也就意味着,刚刚存储的数据,并不能马上查询到。

当然这里还要区分查询的方式,ES也有数据的查询以及搜索,这里的近实时强调的是搜索....

2 集群

在ES中,对用户来说集群是很透明的。你只需要指定一个集群的名字(默认是elasticsearch),启动的时候,凡是集群是这个名字的,都会默认加入到一个集群中。

你不需要做任何操作,选举或者管理都是自动完成的。

对用户来说,仅仅是一个名字而已!

3 节点

跟集群的概念差不多,ES启动时会设置这个节点的名字,一个节点也就是一个ES得服务器。

默认会自动生成一个名字,这个名字在后续的集群管理中还是很有作用的,因此如果想要手动的管理或者查看一些集群的信息,最好是自定义一下节点的名字。

4 索引

索引是一类文档的集合,所有的操作比如索引(索引数据)、搜索、分析都是基于索引完成的。

在一个集群中,可以定义任意数量的索引。

5 类型

类型可以理解成一个索引的逻辑分区,用于标识不同的文档字段信息的集合。但是由于ES还是以索引为粗粒度的单位,因此一个索引下的所有的类型,都存放在一个索引下。这也就导致不同类型相同字段名字的字段会存在类型定义冲突的问题。

在2.0之前的版本,是可以插入但是不能搜索;在2.0之后的版本直接做了插入检查,禁止字段类型冲突。

6 文档

文档是存储数据信息的基本单元,使用json来表示。

7 分片与备份

在ES中,索引会备份成分片,每个分片是独立的lucene索引,可以完成搜索分析存储等工作。

分片的好处:

1 如果一个索引数据量很大,会造成硬件硬盘和搜索速度的瓶颈。如果分成多个分片,分片可以分摊压力。

2 分片允许用户进行水平的扩展和拆分

3 分片允许分布式的操作,可以提高搜索以及其他操作的效率

拷贝一份分片就完成了分片的备份,那么备份有什么好处呢?

1 当一个分片失败或者下线时,备份的分片可以代替工作,提高了高可用性。

2 备份的分片也可以执行搜索操作,分摊了搜索的压力。

ES默认在创建索引时会创建5个分片,这个数量可以修改。

不过需要注意:

1 分片的数量只能在创建索引的时候指定,不能在后期修改

2 备份的数量可以动态的定义

1.3、Elasticsearch主要解决问题

1)检索相关数据; 
2)返回统计结果; 
3)速度要快:

1.4、Elasticsearch工作原理

当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。这个过程如下图所示: 

1.5、Elasticsearch对外接口

1)JAVA API接口

2)RESTful API接口

1.6、Elasticsearch JAVA客户端

1.Transport客户端

Transport Client表示传输客户端,ElasticSearch内置客户端的一种,使用传输模块远程连接到Elasticsearch集群。


2.Jest客户端

Jest是ElasticSearch的Java HTTP Rest客户端,第三方工具,它为索引和搜索结果提供了一个POJO编组机制

1.7、全文检索

全文检索就是对一篇文章进行索引,可以根据关键字搜索,类似于mysql里的like语句。 
全文索引就是把内容根据词的意义进行分词,然后分别创建索引,例如”你们的激情是因为什么事情来的” 可能会被分词成:“你们“,”激情“,“什么事情“,”来“ 等token,这样当你搜索“你们” 或者 “激情” 都会把这句搜出来。

二、Elasticsearch与传统关系型数据库对比

在ElasticSearch中,我们常常会听到Index、Type以及Document等概念,将Elasticsearch和传统关系型数据库MySQL做一下类比:

index => databases
type => table
field => field
document => record
mapping => schema

简单描述:

1) Index
定义:类似于mysql中的database。索引只是一个逻辑上的空间,物理上是分为多个文件来管理的。
命名:必须全小写
描述:因为本身ES是基于Lucene的,所以内部索引的本质上其实Lucene的索引构造方式.

ES中index可能被分为多个分片【对应物理上的lcenne索引】,在实践过程中每个index都会有一个相应的副 本。主要用来在硬件出现问题时,用来回滚数据的。这也某种程序上,加剧了ES对于内存高要求。

2)Type
定义:类似于mysql中的table,根据用户需求每个index中可以新建任意数量的type。

3)Document
定义:对应mysql中的row。有点类似于MongoDB中的文档结构,每个Document是一个json格式的文本。

4)Mapping
更像是一个用来定义每个字段类型的语义规范在mysql中类似sql语句,在ES中经过包装后,都被封装为友好的Restful风格的接口进行操作。这一点也是为什么开发人员更愿意使用ES或者compass这样的框架而不是直接使用Lucene的一个原因。

5)Shards & Replicas
定义:能够为每个索引提供水平的扩展以及备份操作。
描述:
Shards:在单个节点中,index的存储始终是有限制,并且随着存储的增大会带来性能的问题。为了解决这个问题,ElasticSearch提供一个能够分割单个index到集群各个节点的功能。你可以在新建这个索引时,手动的定义每个索引分片的数量。


6)Replicas

在每个node出现宕机或者下线的情况,Replicas能够在该节点下线的同时将副本同时自动分配到其他仍然可用的节点。而且在提供搜索的同时,允许进行扩展节点的数量,在这个期间并不会出现服务终止的情况。
默认情况下,每个索引会分配5个分片,并且对应5个分片副本,同时会出现一个完整的副
本【包括5个分配的副本数据】。

从 Elasticsearch 中取出一条数据(document)看看:

由index、type和id三者唯一确定一个document,_source 字段中是具体的document 值,是一个JSON 对象,有5个field组成。

注意:mysql的Index和Elasticsearch的Index含义并不一致。

Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表), 每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。数据被存储和索引在分片(shards)中,索引只是把一个或多个分片分组在一起的逻辑空间。我们只需要知道文档存储在索引(index)中。其他细节都可以有Elasticsearch搞定。

总结:

(1)关系型数据库中的数据库(DataBase),等价于ES中的索引(Index) 
(2)一个数据库下面有N张表(Table),等价于1个索引Index下面有N多类型(Type), 
(3)一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成。 
(4)在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。 与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。 
(5)在数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT/POST、删Delete、改_update、查GET.

三、Elasticsearch应用场景

1.它提供了强大的搜索功能,可以实现类似百度、谷歌等搜索。
2.可以搜索日志或者交易数据,用来分析商业趋势、搜集日志、分析系统瓶颈或者运行发展等等
3.可以提供预警功能(持续的查询分析某个数据,如果超过一定的值,就进行警告)
4.分析商业信息,在百万级的大数据中轻松的定位关键信息
5.维基百科使用Elasticsearch来进行全文搜做并高亮显示关键词,以及提供search-as-you-type、did-you-mean等搜索建议功能。
6.英国卫报使用Elasticsearch来处理访客日志,以便能将公众对不同文章的反应实时地反馈给各位编辑。
7.StackOverflow将全文搜索与地理位置和相关信息进行结合,以提供more-like-this相关问题的展现。
8.GitHub使用Elasticsearch来检索超过1300亿行代码。

四、Elasticsearch与Lucene的区别?

Elasticsearch执行搜索的速度更快,可以简单的通过HTTP方式,使用JSON来操作数据,并支持对分布式集群的搜索。

Elasticsearch对分布式支持,其索引功能分拆为多个分片,每个分片可有0个或多个副本,集群中的每个数据节点都可承载一个或多个分片,并且能协调和处理各种操作;负载再平衡(Rebalancing)和路由(Routing)在大多数情况下都是自动完成的。

Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

五、Elasticsearch与Solr的区别?

比较总结: 

1 都是基于Lucene,且安装都很简单 
2 Solr利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能 
3 Solr支持更多格式的数据,而Elasticsearch仅支持json格式 
4 Solr官方提供功能较多,而Elasticsearch更注重核心功能,高级功能多由第三方插件提供 
5 Solr在传统的搜索应用中表现好于Elasticsearch,但Elasticsearch在实时搜索应用中效率更高

结论:
1. solr查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用;
2.ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索。

Elasticsearch 基本使用

一、Restful API

Elasticsearch提供了Restful API,使用json格式,这使得它非常利于与外部交互,Restful的接口很简单,一个url表示一个特定的资源,譬如/blog/article/1,就表示一个index为blog,type为aritcle,id为1的document。
而我们使用http标准method来操作这些资源,POST新增,PUT更新,GET获取,DELETE删除,HEAD判断是否存在。

RESTful接口URL的格式是

VERB HTTP方法:GET(获取), POST(更新), PUT(创建), HEAD, DELETE(删除)
PROTOCOL: http或者https协议(只有在Elasticsearch前面有https代理的时候可用)
HOST: Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
PORT: Elasticsearch HTTP服务所在的端口,默认为9200
QUERY_STRING: 一些可选的查询请求参数,例如?pretty参数将使请求返回更加美观易读的JSON数据
BODY: 一个JSON格式的请求主体(如果请求需要的话)

二、基础操作

index:写 document 到 Elasticsearch 中,如果不存在,就创建,如果存在,就用新的取代旧的。
create:写 document 到 Elasticsearch 中,与 index 不同的是,如果存在,就抛出异常DocumentAlreadyExistException。
get:根据ID取出document。
update:如果是更新整个 document,可用index 操作。如果是部分更新,用update操作。在Elasticsearch中,更新document时,是把旧数据取出来,然后改写要更新的部分,删除旧document,创建新document,而不是在原document上做修改。

delete:删除document。Elasticsearch 会标记删除document,然后,在Lucene 底层进行merge时,会删除标记删除的document。

三、Filter 与 Query

Elasticsearch 使用 domain-specific language(DSL)进行查询,DSL 使用 JSON 进行表示。
DSL 由一些子查询组成,这些子查询可应用于两类查询,分别是filter 和 query。
filter 正如其字面意思“过滤”所说的,是起过滤的作用,任何一个document 对 filter 来说,就是match 与否的问题,是个二值问题,0和1,没有scoring的过程。
使用query的时候,是表示match 程度问题,有scroing 过程。
另外,Filter 和 Query 还有性能上的差异,Elasticsearch 底层对Filter做了很多优化,会对过滤结果进行缓存;同时,Filter 没有相关性计算过程,所以,Filter 比 Query 快。
所以,官网推荐,作为一条比较通用的规则,仅在全文检索时使用Query,其它时候都用Filter。但是,根据我们的使用情况来看,在过滤条件不是很强的情况下,缓存可能会占用较多内存,如果这些数据不是频繁使用,用空间换时间不一定划算。

四、API 惯例、规则 

1、大多数API都支持index参数,它的值可以是test1,test2,test3 这种形式,也可以使用通配符test*,*test,te*st等,如果是_all那就是作用于所有index,也支持使用+\-号(+test*,-test3),当然,一些作用对象是单个索引的API就不支持这个特性了。

2、Date  math  support in index name  (索引名称的日期数学运算)

       格式:<static_name{date_math_expr{date_format|time_zone}}>  

所有表达式必须是经过URIEncode编码的。 GET   /<logstash-{now/d}>/_search  请求必须写成  GET /%3Clogstash-%7Bnow%2Fd%7D%3E/_search。

       假如当前日期是2020年5月20日中午12:30  ,Date  math表达式为<logstash-{now/d}>,那当前日期将被解析为:logstash-2024.03.22。

以下是官网给出的例子:
       <logstash-{now/d}>                logstash-2024.03.22
       <logstash-{now/M}>                logstash-2024.03.01  
       <logstash-{now/M{YYYY.MM}}>       logstash-2024.03  
       <logstash-{now/M-1M{YYYY.MM}}>    logstash-2024.02  
       <logstash-{now/d{YYYY.MM.dd|+12:00}}>   logstash-2024.03.23  

注意最后一个的写法:+12h  加上12小时 

3、 通用的可选参数 

1)pretty=true/false 返回结果数据是否以漂亮的格式展示
2)human=true/false  返回结果数据是否以人类易读形式显示
3)Date  math 操作   +1h  +1M(月份)  +1m(分钟) +1y 等等
4)返回结果过滤  GET /_search?q=elasticsearch&filter_path=took,hits.hits._id,hits.hits._score ,返回的格式如下:

5)flat_settings  是否以扁平方式显示 =true 和 =false的返回结果分别是:

6) 还有一些其他的error_trace等可选参数

4、基于URL的访问控制  URL-based  access control

Elasticsearch5.5.1与插件安装

Elasticsearch官网地址:https://www./cn/ ,网上的教程用得比较多是2.x版本的,直到 2016-12 推出了5.x 版本 ,将版本号调为 5.X ,这是为了和Kibana、Beats、Logstash等产品版本号进行统一,Elasticsearch5.x加入了一些新特性,

官网首页如下:

点击"Dowloads"选择Elasticsearch

选择发行版,默认当前版本为5.5.1然后进行下载

二、进行安装

下载下来之后,进行解压

进入bin目录下

执行elasticsearch.bat进行启动

启动成功,访问地址为:127.0.0.1:9200,输出信息如下

然后访问这个地址查看版本等一些信息,这不是图形化的界面,操作起来不是很方便,所以希望能有一个可视化的环境来操作它,可以通过安装Elasticsearch Head这个插件来进行管理。

三、插件安装

名词解释
在刚接触Elasticsearch的时候,会有很多名词不能理解,或者不知道其中的关系。其中很多是为不同版本的Elasticsearch而存在的。

Marvel
Marvel插件:在簇中从每个节点汇集数据。这个插件必须每个节点都得安装。 
Marvel是Elasticsearch的管理和监控工具,在开发环境下免费使用。它包含了Sense。

Sense
交互式控制台,使用户方便的通过浏览器直接与Elasticsearch进行交互。

Head
在学习Elasticsearch的过程中,必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求,未免太过麻烦,而且也不够人性化。此时,Head插件可以实现基本信息的查看,rest请求的模拟,数据的检索等等。

X-pack
x-pack是elasticsearch的一个扩展包,将安全,警告,监视,图形和报告功能捆绑在一个易于安装的软件包中,也是官方推荐的。

Kibana

kibana是一个与elasticsearch一起工作的开源的分析和可视化的平台。使用kibana可以查询、查看并与存储在elasticsearch索引的数据进行交互操作。使用kibana能执行高级的数据分析,并能以图表、表格和地图的形式查看数据。kibana使得理解大容量的数据变得非常容易。它非常简单,基于浏览器的接口使我们能够快速的创建和分享显示elasticsearch查询结果实时变化的仪表盘。
在Elasticsearch 5版本之前,一般都是通过安装Kibana,而后将Marvel、Hand等各种功能插件添加到Kibana上使用。在Elasticsearch 5版本之后,一般情况下只需要安装一个官方推荐的X-pack扩展包即可。

1)Elasticsearch Head

Elasticsearch Head是集群管理、数据可视化、增删改查、查询语句可视化工具,在最新的ES5中安装方式和ES2以上的版本有很大的不同,在ES2中可以直接在bin目录下执行plugin install xxxx 来进行安装,但是在ES5中这种安装方式变了,要想在ES5中安装Elasticsearch Head必须要安装NodeJs,然后通过NodeJS来启动Head。具体安装步骤如下:

首页去github下载源码:https://github.com/mobz/elasticsearch-head 

下载下来之后,要安装NodeJS

安装NodeJS之后,使用npm安装grunt

然后在目录下执行

安装好之后,还要修改Elasticsearch配置文件,编辑elasticsearch-5.5.1/config/elasticsearch.yml,加入以下内容:

编辑elasticsearch-head-master文件下的Gruntfile.js,修改服务器监听地址,增加hostname属性,将其值设置为*。

以下两种配置都是OK的

# Type1

# Type 2

编辑elasticsearch-head-master/_site/app.js,修改head连接es的地址,将localhost修改为es的IP地址

# 原配置

# 将localhost修改为ES的IP地址

注意:如果ES是在本地,就不要修改,默认就是localhost

在启动elasticsearch-head之前要先启动elasticsearch,在elasticsearch-head-master/目录下,运行启动命令:

然后访问:127.0.0.1:9100这个地址

注意:

① 此时elasticsearch-head为前台启动,如果终端退出,那么elasticsearch-head服务也会随之关闭。

② 在非elasticsearch-head目录中启动server会失败!因为grunt需要读取目录下的Gruntfile.js。

2)安装Kiabna

Kibana是一个为 ElasticSearch 提供的数据分析的 Web 接口。可使用它对日志进行高效的搜索、可视化、分析等各种操作。
Kiabna的介绍可查考官方的说明:https://www./cn/products/kibana 

下载地址为:https://www./cn/downloads/kibana

下载下来,解压如下

修改config / kibana.yml文件,加入以下内容:

然后执行bin目录下的kibana.bat启动服务

浏览器访问地址:http://127.0.0.1:5601/

出现警告

不管怎么弄,都是提示上面的错误!!!最后在网上找到中说法是,没有往Elasticsearch中插入数据所引起的:

https://discuss./t/unable-to-fetch-mapping-do-you-have-indices-matching-the-pattern/73791/4

https://www./guide/en/kibana/current/tutorial-define-index.html

https://www./guide/en/kibana/current/tutorial-load-dataset.html

在上面的两个网址中找到了解决方法:

在Sense中执行以下数据就可以了

然后在返回到kibana首页,就会发现不会出现警告了!!!

然后点击"Create"

3)安装Logstash

Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。

官网下载地址为:https://www./downloads/logstash

下载下来之后,解压如下

然后添加配置文件

添加如下内容:

然后启动服务

4)安装x-pack

x-pack是elasticsearch的一个扩展包,将安全,警告,监视,图形和报告功能捆绑在一个易于安装的软件包中,虽然x-pack被设计为一个无缝的工作,但是你可以轻松的启用或者关闭一些功能,X-Pack主要是添加身份权限的验证,以及原先需要安装其他各种Marvel、Head等各种功能插件添加到Kibana上使用才能使用的功能。

X-PACK详细介绍可查看:https://www./products/x-pack

安装的两种方式:

1.离线安装

xxx(路径)\bin>.\elasticsearch-plugin.bat install file:/G:\Developer\Elasticsearch5\x-pack-5.5.1.zip  (Windows下file:/或者 file:///都行)

2.在线安装

xxx(路径)\bin>.\elasticsearch-plugin.bat install x-pack

注意的是能在线安装的插件和早先版本有所区别,可通过cmd cd至ES 的bin目录下elasticsearch-plugin.bat install -h 命令查看

5.5.1版本可在线安装的插件列表如下:

在线安装如下:

然后在Kibana中也安装x-pack,安装方式如下:

安装好X-PACK之后,启动Elasticsearch就提示:

Caused by: java.io.FileNotFoundException: \\.\pipe\controller_log_4992 (系统找不到指定的文件。)在网上找了半天才找到解决方法:

https://discuss./t/unable-to-start-elasticsearch-5-4-0-in-docker/84800

在Elasticsearch/config/elasticsearch.yml加入以下参数:

再次启动

成功运行

5)IK分词器和拼音分词器的安装

分词顾名思义,就是把一句话分成一个一个的词。
安装中文分词器IK
https://github.com/medcl/elasticsearch-analysis-ik
执行以下命令:

安装拼音分词器pinyin
https://github.com/medcl/elasticsearch-analysis-pinyin

pinyin分词器可以让用户输入拼音,就能查找到相关的关键词。比如在某个商城搜索中,输入shuihu,就能匹配到水壶。这样的体验还是非常好的。
执行以下命令:

6)Elasticsearch SQL查询插件

Elasticsearch-sql 是给予es的提供sql查询服务。你可以很方便的用sql的方式查询es的数据。不必困扰于ES变态的查询表达式,同时提供了超越sql的功能。Github地址: https://github.com/NLPchina/elasticsearch-sql/

5.5.1插件的安装方式如下

然后下载客户端https://github.com/NLPchina/elasticsearch-sql/releases/download/5.4.1.0/es-sql-site-standalone.zip

解压,进入site-server目录

执行以下命令

进行安装与启动,然后访问:http://localhost:8080/index.html

输入一个存在的索引,然后点击Search进行查询。

注意:

右上脚的连接地址,要改成你要连接的那个ES地址。

Elasticsearch索引文档的增删改查

1、RESTful接口格式

1.1、RESTful接口URL的格式:

其中index、type是必须提供的。
id是可选的,不提供es会自动生成。
index、type将信息进行分层,利于管理。
index可以理解为数据库;type理解为数据表;id相当于数据库表中记录的主键,是唯一的。

1.2、HTTP客户端

操作REST API常用的有通过CRUL命令,Chrome Sense插件,httpie,kibana中的Dev Tools,head等,下面一一介绍下.

A)CURL命令

在windows下可以安装curl.exe来执行curl命令,或者安装GIT,它自带了一个BASH

2)Sense插件

3)httpie

4)Dev Tools

5)Head

1.3、样例数据

A)下载样例数据

ES官网下载样例数据,并使用在线工具生成json数据

B)加载样例数据集

下载样例数据集链接,解压数据到指定目录,然后

 ● 创建一个索引库:

● 导入数据:

绝对路径:

相对路径:

注意:
1 需要在accounts.json所在的目录运行curl命令。
2 localhost:9200是ES得访问地址和端口
3 bank是索引的名称
4 account是类型的名称
5 索引和类型的名称在文件中如果有定义,可以省略;如果没有则必须要指定
6 _bulk是rest得命令,可以批量执行多个操作(操作是在json文件中定义的,原理可以参考之前的翻译)
7 pretty是将返回的信息以可读的JSON形式返回。

2、索引文档的创建

格式:

例如:

索引名字是:fendo;
索引的类型是:es;
本记录的id是:1

通过CURL命令:

通过sense

返回的信息可以看到创建是成功的,并且版本号是1;ES会对记录修改进行版本跟踪,第一次创建记录为1,同一条记录每修改一次就追加1。

至此一条记录就提交到ES中建立了索引,注意HTTP的方法是PUT,不要选择错了。

3、索引文档的查询

ES提供了两种搜索的方式:请求参数方式 和 请求体方式。

A)请求参数方式

其中fendo是查询的索引名称,q后面跟着搜索的条件:q=*表示查询所有的内容
B)请求体方式(推荐这种方式)

这种方式会把查询的内容放入body中,会造成一定的开销,但是易于理解。在平时的练习中,推荐这种方式。

根据索引时的ID查询的文档的RESTful接口如下

HTTP方法采用GET的形式。

用head看的更直观些:

返回的内容大致如下:
took:是查询花费的时间,毫秒单位
time_out:标识查询是否超时
_shards:描述了查询分片的信息,查询了多少个分片、成功的分片数量、失败的分片数量等
hits:搜索的结果,total是全部的满足的文档数目,hits是返回的实际数目(默认是10)
_score是文档的分数信息,与排名相关度有关。

4、索引文档的更新

根据索引时的ID更新的文档的内容其RESTful接口如下

HTTP方法采用PUT或POST形式。

将名字由“fendo”改成“fk”;

结果中的version字段已经成了2,因为我们这是是修改,索引版本递增;created字段是false,表示这次不是新建而是更新。

更新接口与创建接口完全一样,ES会查询记录是否存在,如果不存在就是创建,存在就是更新操作。

5、索引文档的删除

根据索引时的ID更新的文档的内容其RESTful接口如下

HTTP方法采用DELETE的形式。

删除过后,再通过查询接口去查询将得不到结果。

JAVA客户端之TransportClient操作详解

Elasticsearch JAVA操作有三种客户端:

1、TransportClient

2、JestClient

3、RestClient

还有种是2.3中有的NodeClient,在5.5.1中好像没有了。还有种是spring-data-elasticsearch,这里先以TransportClient来讲解CRUD,所用环境为:

JDK1.8

ES5.5.1

TransportClient5.5.1

POM.XML文件代码:

temp详细代码如下:

链接:https://pan.baidu.com/s/10GZJQB-kmP3MTRbUD8LHXQ 密码:qc5a

JAVA客户端之Jest操作详解

Jest示例代码如下:

链接:https://pan.baidu.com/s/10GZJQB-kmP3MTRbUD8LHXQ 密码:qc5a

JAVA客户端之RestClient操作详解

elasticsearch 5.0引入了一个新的客户端 RestClient ,使用HTTP API elasticsearch代替内部协议, RestClient 初始化方法是线程安全的,最理想的客户端生命周期是与应用相同,在应用停止服务之前应该关闭客户端链接,释放资源。

RestClient完整示例如下:

链接:https://pan.baidu.com/s/10GZJQB-kmP3MTRbUD8LHXQ 密码:qc5a

ES生成JSON与解析JSON的方式

四种方式如下,官网文档:https://www./guide/en/elasticsearch/client/java-api/current/java-docs-index.html :

1.1手写方式生成

1.2使用集合

集合是key:value数据类型,可以代表json结构.

1.3使用JACKSON序列化

ElasticSearch已经使用了jackson,可以直接使用它把javabean转为json.

1.4使用ElasticSearch 帮助类

完整示例:

二、解析JSON

Jest对获取的JSON数据,有两种解析方式

1、手动解析

2、自动解析:

使用Logstash-input-jdbc同步数据库中的数据到ES

1、数据同步方式

全量同步与增量同步
全量同步是指全部将数据同步到es,通常是刚建立es,第一次同步时使用。增量同步是指将后续的更新、插入记录同步到es。

2、常用的一些ES同步方法

1)、elasticsearch-jdbc: 严格意义上它已经不是第三方插件。已经成为独立的第三方工具。不支持5.5.1。。。
2)、elasticsearch-river-mysql插件:  https://github.com/scharron/elasticsearch-river-mysql 
3)、go-mysql-elasticsearch(国内作者siddontang):  https://github.com/siddontang/go-mysql-elasticsearch
4)、python-mysql-replication:  github地址 https://github.com/noplay/python-mysql-replication
5)、MySQL Binlog:  通过 MySQL binlog 将 MySQL 的数据同步给 ES, 只能使用 row 模式的 binlog。
6)、Logstash-input-jdbc:  github地址 https://github.com/logstash-plugins/logstash-input-jdbc

3、Logstash-input-jdbc安装

由于我用的ES版本是5.5.1,elasticsearch-jdbc不支持,只支持2.3.4,这就尴尬了。

所用这里用Logstash-input-jdbc来同步数据,logstash-input-jdbc插件是logstash 的一个个插件,使用ruby语言开发。所以要先安装ruby,也是为了好使用ruby中的gem安装插件,下载地址:https:///downloads/ 

下载下来之后,进行安装

安装好之后试下是否安装成功,打开CMD输入:

OK,然后修改gem的源,使用以下命令查看gem源

删除默认的源

添加新的源

更改成功,还的修改Gemfile的数据源地址。步骤如下:

然后就是安装logstash-input-jdbc,在logstash-5.5.1/bin目录下

执行安装命令

静等一会儿,成功之后提示如下

4、Logstash-input-jdbc使用

官方文档地址 

https://www./guide/en/logstash/current/plugins-inputs-jdbc.html

首先在bin目录下新建一个mysql目录,里面包含jdbc.conf,jdbc.sql文件,加入mysql的驱动

A)全量同步

jdbc.conf配置如下

各数据库对应的链接如下:

MySQL数据库

Driver ="path/to/jdbc-drivers/mysql-connector-java-5.1.35-bin.jar"   //驱动程序
Class  ="com.mysql.jdbc.Driver"; 
URL  ="jdbc:mysql://localhost:3306/db_name";                           //连接的URL,db_name为数据库名

SQL server数据库

Driver ="path/to/jdbc-drivers/sqljdbc4.jar"
Class  ="com.microsoft.jdbc.sqlserver.SQLServerDriver";
URL   ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name";     //db_name为数据库名

Oracle数据库

Driver ="path/to/jdbc-drivers/ojdbc6-12.1.0.2.jar"
Class  ="oracle.jdbc.driver.OracleDriver";
URL   ="jdbc:oracle:thin:@loaclhost:1521:orcl";     //orcl为数据库的SID

DB2数据库

//连接具有DB2客户端的Provider实例 
Driver ="path/to/jdbc-drivers/jt400.jar"
Class  ="com.ibm.db2.jdbc.app.DB2.Driver"; 
URL   ="jdbc:db2://localhost:5000/db_name";     //db_name为数据可名

PostgreSQL数据库

Driver ="path/to/jdbc-drivers/postgresql-9.4.1201.jdbc4.jar"
Class  ="org.postgresql.Driver";            //连接数据库的方法 
URL   ="jdbc:postgresql://localhost/db_name";      //db_name为数据可名

jdbc.sql配置如下:

就一条查询语句对应的表数据如下:

先启动ES,然后通过sense创建article索引

然后通过以下命令启动logstash

过一会他就会自动的往ES里添加数据,输出的日志如下:

执行了SQL查询。查看下article索引会发现多出来了很多文档

我们在数据库增加一条数据,看他是否自动同步到ES中

静等一会,发现logstash的日志

查询了一篇,ES中的数据会多出刚刚插入的那条

B)增量同步

下面使用增量来新增数据,需要在jdbc.conf配置文件中做如下修改:

参数介绍:

这里使用webmagic爬虫来爬取数据,导入到数据库中,先运行爬虫,爬取一些数据

这里爬取到了277条,然后启动logstash,通过logstash导入到ES中去

打开mysql目录下的station_parameter.txt文件

这个文件里记录上次执行到的 tracking_column 字段的值,比如上次数据库有 10000 条记录,查询完后该文件中就会有数字 10000 这样的记录,下次执行 SQL 查询可以从 10001 条处开始,我们只需要在 SQL 语句中 WHERE MY_ID > :last_sql_value 即可. 其中 :last_sql_value 取得就是该文件中的值。

然后开启爬虫,爬取数据,往数据库里插,logstash会自动的识别到更新,然后导入到ES中!!

使用webmagic爬取数据导入到ES

webmagic主要有两个文件

一个是对爬取页面进行处理,一个是对页面处理之后的数据进行保存:

CSDNPageProcessor

注意:

在上面的代码中,不但通过jdbcPipeline保存了数据,还通过TransportClient 往ES中保存了数据!!

JdbcPipeline

对应的数据库脚本:

Spring整合Elasticsearch5.5.1的TransportClient客户端

源码链接:https://pan.baidu.com/s/1WOp-PjiHXqTUFCnUpLShNw 密码:6cw8

一、项目介绍

最近一直在弄Elasticsearch,所以学习了下Spring整合Elasticsearch的TransportClient客户端,使用的是spring提供的@Configuration注解来管理TransportClient客户端,具体如下:

TransportClient客户端配置实体类:

TransportClient管理类:

然后在Service实现类中通过一下方式注入进来使用:

首页搜索页面如下所示

能对搜索的关键字实现高亮显示

二、原理分析

实现代码如下,由于只是个简单的搜索,代码写得也是很简单。。。

所有的数据都是用webmagic爬虫进行爬取得,然后使用Logstash-input-jdbc同步数据库中的数据到ES

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多