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的RESTfulAPI进行交流。
下图是Elasticsearch插件head的一个截图
要了解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.4、Elasticsearch工作原理
当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。这个过程如下图所示:
1.5、Elasticsearch对外接口
1)JAVAAPI接口
2)RESTfulAPI接口
1.6、ElasticsearchJAVA客户端
1.Transport客户端
TransportClient表示传输客户端,ElasticSearch内置客户端的一种,使用传输模块远程连接到Elasticsearch集群。
2.Jest客户端
Jest是ElasticSearch的JavaHTTPRest客户端,第三方工具,它为索引和搜索结果提供了一个POJO编组机制
二、Elasticsearch与传统关系型数据库对比
在ElasticSearch中,我们常常会听到Index、Type以及Document等概念,将Elasticsearch和传统关系型数据库MySQL做一下类比:
index=>databasestype=>tablefield=>fielddocument=>recordmapping=>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应用场景
四、Elasticsearch与Lucene的区别?
Elasticsearch执行搜索的速度更快,可以简单的通过HTTP方式,使用JSON来操作数据,并支持对分布式集群的搜索。
Elasticsearch对分布式支持,其索引功能分拆为多个分片,每个分片可有0个或多个副本,集群中的每个数据节点都可承载一个或多个分片,并且能协调和处理各种操作;负载再平衡(Rebalancing)和路由(Routing)在大多数情况下都是自动完成的。
五、Elasticsearch与Solr的区别?
比较总结:
1都是基于Lucene,且安装都很简单2Solr利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能3Solr支持更多格式的数据,而Elasticsearch仅支持json格式4Solr官方提供功能较多,而Elasticsearch更注重核心功能,高级功能多由第三方插件提供5Solr在传统的搜索应用中表现好于Elasticsearch,但Elasticsearch在实时搜索应用中效率更高
结论:1.solr查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用;2.ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索。
一、RestfulAPI
RESTful接口URL的格式是
二、基础操作
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
四、API惯例、规则
1、大多数API都支持index参数,它的值可以是test1,test2,test3这种形式,也可以使用通配符test*,*test,te*st等,如果是_all那就是作用于所有index,也支持使用+\-号(+test*,-test3),当然,一些作用对象是单个索引的API就不支持这个特性了。
2、Datemathsupportinindexname(索引名称的日期数学运算)
格式:
所有表达式必须是经过URIEncode编码的。GET/
假如当前日期是2020年5月20日中午12:30,Datemath表达式为
以下是官网给出的例子:
注意最后一个的写法:+12h加上12小时
3、通用的可选参数
1)pretty=true/false返回结果数据是否以漂亮的格式展示2)human=true/false返回结果数据是否以人类易读形式显示3)Datemath操作+1h+1M(月份)+1m(分钟)+1y等等4)返回结果过滤GET/_searchq=elasticsearch&filter_path=took,hits.hits._id,hits.hits._score,返回的格式如下:
5)flat_settings是否以扁平方式显示=true和=false的返回结果分别是:
6)还有一些其他的error_trace等可选参数
4、基于URL的访问控制URL-basedaccesscontrol
官网首页如下:
点击"Dowloads"选择Elasticsearch
选择发行版,默认当前版本为5.5.1然后进行下载
二、进行安装
下载下来之后,进行解压
进入bin目录下
执行elasticsearch.bat进行启动
启动成功,访问地址为:127.0.0.1:9200,输出信息如下
然后访问这个地址查看版本等一些信息,这不是图形化的界面,操作起来不是很方便,所以希望能有一个可视化的环境来操作它,可以通过安装ElasticsearchHead这个插件来进行管理。
三、插件安装
名词解释在刚接触Elasticsearch的时候,会有很多名词不能理解,或者不知道其中的关系。其中很多是为不同版本的Elasticsearch而存在的。
MarvelMarvel插件:在簇中从每个节点汇集数据。这个插件必须每个节点都得安装。Marvel是Elasticsearch的管理和监控工具,在开发环境下免费使用。它包含了Sense。
Sense交互式控制台,使用户方便的通过浏览器直接与Elasticsearch进行交互。
Head在学习Elasticsearch的过程中,必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求,未免太过麻烦,而且也不够人性化。此时,Head插件可以实现基本信息的查看,rest请求的模拟,数据的检索等等。
X-packx-pack是elasticsearch的一个扩展包,将安全,警告,监视,图形和报告功能捆绑在一个易于安装的软件包中,也是官方推荐的。
Kibana
1)ElasticsearchHead
ElasticsearchHead是集群管理、数据可视化、增删改查、查询语句可视化工具,在最新的ES5中安装方式和ES2以上的版本有很大的不同,在ES2中可以直接在bin目录下执行plugininstallxxxx来进行安装,但是在ES5中这种安装方式变了,要想在ES5中安装ElasticsearchHead必须要安装NodeJs,然后通过NodeJS来启动Head。具体安装步骤如下:
下载下来之后,要安装NodeJS
安装NodeJS之后,使用npm安装grunt
然后在目录下执行
安装好之后,还要修改Elasticsearch配置文件,编辑elasticsearch-5.5.1/config/elasticsearch.yml,加入以下内容:
编辑elasticsearch-head-master文件下的Gruntfile.js,修改服务器监听地址,增加hostname属性,将其值设置为*。
以下两种配置都是OK的
#Type1
#Type2
编辑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
下载下来,解压如下
修改config/kibana.yml文件,加入以下内容:
然后执行bin目录下的kibana.bat启动服务
出现警告
不管怎么弄,都是提示上面的错误!!!最后在网上找到中说法是,没有往Elasticsearch中插入数据所引起的:
在上面的两个网址中找到了解决方法:
在Sense中执行以下数据就可以了
然后在返回到kibana首页,就会发现不会出现警告了!!!
然后点击"Create"
3)安装Logstash
Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。
下载下来之后,解压如下
然后添加配置文件
添加如下内容:
然后启动服务
4)安装x-pack
x-pack是elasticsearch的一个扩展包,将安全,警告,监视,图形和报告功能捆绑在一个易于安装的软件包中,虽然x-pack被设计为一个无缝的工作,但是你可以轻松的启用或者关闭一些功能,X-Pack主要是添加身份权限的验证,以及原先需要安装其他各种Marvel、Head等各种功能插件添加到Kibana上使用才能使用的功能。
安装的两种方式:
1.离线安装
xxx(路径)\bin>.\elasticsearch-plugin.batinstallfile:/G:\Developer\Elasticsearch5\x-pack-5.5.1.zip(Windows下file:/或者file:///都行)
2.在线安装
xxx(路径)\bin>.\elasticsearch-plugin.batinstallx-pack
注意的是能在线安装的插件和早先版本有所区别,可通过cmdcd至ES的bin目录下elasticsearch-plugin.batinstall-h命令查看
5.5.1版本可在线安装的插件列表如下:
在线安装如下:
然后在Kibana中也安装x-pack,安装方式如下:
安装好X-PACK之后,启动Elasticsearch就提示:
Causedby:java.io.FileNotFoundException:\\.\pipe\controller_log_4992(系统找不到指定的文件。)在网上找了半天才找到解决方法:
在Elasticsearch/config/elasticsearch.yml加入以下参数:
再次启动
成功运行
6)ElasticsearchSQL查询插件
5.5.1插件的安装方式如下
解压,进入site-server目录
执行以下命令
输入一个存在的索引,然后点击Search进行查询。
注意:
右上脚的连接地址,要改成你要连接的那个ES地址。
1、RESTful接口格式
1.1、RESTful接口URL的格式:
其中index、type是必须提供的。id是可选的,不提供es会自动生成。index、type将信息进行分层,利于管理。index可以理解为数据库;type理解为数据表;id相当于数据库表中记录的主键,是唯一的。
1.2、HTTP客户端
A)CURL命令
在windows下可以安装curl.exe来执行curl命令,或者安装GIT,它自带了一个BASH
2)Sense插件
4)DevTools
5)Head
1.3、样例数据
A)下载样例数据
ES官网下载样例数据,并使用在线工具生成json数据
B)加载样例数据集
下载样例数据集链接,解压数据到指定目录,然后
●创建一个索引库:
●导入数据:
绝对路径:
相对路径:
注意:1需要在accounts.json所在的目录运行curl命令。2localhost:9200是ES得访问地址和端口3bank是索引的名称4account是类型的名称5索引和类型的名称在文件中如果有定义,可以省略;如果没有则必须要指定6_bulk是rest得命令,可以批量执行多个操作(操作是在json文件中定义的,原理可以参考之前的翻译)7pretty是将返回的信息以可读的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看的更直观些:
4、索引文档的更新
根据索引时的ID更新的文档的内容其RESTful接口如下
HTTP方法采用PUT或POST形式。
将名字由“fendo”改成“fk”;
结果中的version字段已经成了2,因为我们这是是修改,索引版本递增;created字段是false,表示这次不是新建而是更新。
更新接口与创建接口完全一样,ES会查询记录是否存在,如果不存在就是创建,存在就是更新操作。
5、索引文档的删除
HTTP方法采用DELETE的形式。
删除过后,再通过查询接口去查询将得不到结果。
ElasticsearchJAVA操作有三种客户端:
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详细代码如下:
Jest示例代码如下:
elasticsearch5.0引入了一个新的客户端RestClient,使用HTTPAPIelasticsearch代替内部协议,RestClient初始化方法是线程安全的,最理想的客户端生命周期是与应用相同,在应用停止服务之前应该关闭客户端链接,释放资源。
RestClient完整示例如下:
1.1手写方式生成
1.2使用集合
集合是key:value数据类型,可以代表json结构.
1.3使用JACKSON序列化
ElasticSearch已经使用了jackson,可以直接使用它把javabean转为json.
1.4使用ElasticSearch帮助类
完整示例:
二、解析JSON
Jest对获取的JSON数据,有两种解析方式
1、手动解析
2、自动解析:
1、数据同步方式
全量同步与增量同步全量同步是指全部将数据同步到es,通常是刚建立es,第一次同步时使用。增量同步是指将后续的更新、插入记录同步到es。
2、常用的一些ES同步方法
3、Logstash-input-jdbc安装
由于我用的ES版本是5.5.1,elasticsearch-jdbc不支持,只支持2.3.4,这就尴尬了。
下载下来之后,进行安装
安装好之后试下是否安装成功,打开CMD输入:
OK,然后修改gem的源,使用以下命令查看gem源
删除默认的源
添加新的源
更改成功,还的修改Gemfile的数据源地址。步骤如下:
然后就是安装logstash-input-jdbc,在logstash-5.5.1/bin目录下
执行安装命令
静等一会儿,成功之后提示如下
4、Logstash-input-jdbc使用
官方文档地址
首先在bin目录下新建一个mysql目录,里面包含jdbc.conf,jdbc.sql文件,加入mysql的驱动
A)全量同步
jdbc.conf配置如下
各数据库对应的链接如下:
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为数据库名
Driver="path/to/jdbc-drivers/sqljdbc4.jar"Class="com.microsoft.jdbc.sqlserver.SQLServerDriver";URL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name";//db_name为数据库名
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客户端的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为数据可名
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语句中WHEREMY_ID>:last_sql_value即可.其中:last_sql_value取得就是该文件中的值。
然后开启爬虫,爬取数据,往数据库里插,logstash会自动的识别到更新,然后导入到ES中!!
webmagic主要有两个文件
一个是对爬取页面进行处理,一个是对页面处理之后的数据进行保存:
CSDNPageProcessor
在上面的代码中,不但通过jdbcPipeline保存了数据,还通过TransportClient往ES中保存了数据!!
JdbcPipeline
对应的数据库脚本:
一、项目介绍
最近一直在弄Elasticsearch,所以学习了下Spring整合Elasticsearch的TransportClient客户端,使用的是spring提供的@Configuration注解来管理TransportClient客户端,具体如下:
TransportClient客户端配置实体类:
TransportClient管理类:
然后在Service实现类中通过一下方式注入进来使用:
能对搜索的关键字实现高亮显示
二、原理分析
实现代码如下,由于只是个简单的搜索,代码写得也是很简单。。。
所有的数据都是用webmagic爬虫进行爬取得,然后使用Logstash-input-jdbc同步数据库中的数据到ES