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,快捷方便 7.支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。 Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作: 1.分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。 1.2、ElasticSearch相关概念 下图是 Elasticsearch 插件 head 的一个截图 ● node:即一个 Elasticsearch 的运行实例,使用多播或单播方式发现 cluster 并加入。 综上所述,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)检索相关数据; 1.4、Elasticsearch工作原理 当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。这个过程如下图所示: 1.5、Elasticsearch对外接口 1)JAVA API接口 2)RESTful API接口 1.6、Elasticsearch JAVA客户端 1.Transport客户端 Transport Client表示传输客户端,ElasticSearch内置客户端的一种,使用传输模块远程连接到Elasticsearch集群。
Jest是ElasticSearch的Java HTTP Rest客户端,第三方工具,它为索引和搜索结果提供了一个POJO编组机制 1.7、全文检索 二、Elasticsearch与传统关系型数据库对比 在ElasticSearch中,我们常常会听到Index、Type以及Document等概念,将Elasticsearch和传统关系型数据库MySQL做一下类比: index => databases 简单描述: 1) Index ES中index可能被分为多个分片【对应物理上的lcenne索引】,在实践过程中每个index都会有一个相应的副 本。主要用来在硬件出现问题时,用来回滚数据的。这也某种程序上,加剧了ES对于内存高要求。 在每个node出现宕机或者下线的情况,Replicas能够在该节点下线的同时将副本同时自动分配到其他仍然可用的节点。而且在提供搜索的同时,允许进行扩展节点的数量,在这个期间并不会出现服务终止的情况。 从 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) 三、Elasticsearch应用场景 1.它提供了强大的搜索功能,可以实现类似百度、谷歌等搜索。 四、Elasticsearch与Lucene的区别? Elasticsearch执行搜索的速度更快,可以简单的通过HTTP方式,使用JSON来操作数据,并支持对分布式集群的搜索。 Elasticsearch对分布式支持,其索引功能分拆为多个分片,每个分片可有0个或多个副本,集群中的每个数据节点都可承载一个或多个分片,并且能协调和处理各种操作;负载再平衡(Rebalancing)和路由(Routing)在大多数情况下都是自动完成的。 Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。 五、Elasticsearch与Solr的区别? 比较总结: 1 都是基于Lucene,且安装都很简单 结论: Elasticsearch 基本使用一、Restful API Elasticsearch提供了Restful API,使用json格式,这使得它非常利于与外部交互,Restful的接口很简单,一个url表示一个特定的资源,譬如/blog/article/1,就表示一个index为blog,type为aritcle,id为1的document。 RESTful接口URL的格式是 VERB HTTP方法:GET(获取), POST(更新), PUT(创建), HEAD, DELETE(删除) 二、基础操作 index:写 document 到 Elasticsearch 中,如果不存在,就创建,如果存在,就用新的取代旧的。 delete:删除document。Elasticsearch 会标记删除document,然后,在Lucene 底层进行merge时,会删除标记删除的document。 三、Filter 与 Query Elasticsearch 使用 domain-specific language(DSL)进行查询,DSL 使用 JSON 进行表示。 四、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。 以下是官网给出的例子: 注意最后一个的写法:+12h 加上12小时 3、 通用的可选参数 1)pretty=true/false 返回结果数据是否以漂亮的格式展示 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这个插件来进行管理。 三、插件安装 名词解释 Marvel Sense Head X-pack Kibana kibana是一个与elasticsearch一起工作的开源的分析和可视化的平台。使用kibana可以查询、查看并与存储在elasticsearch索引的数据进行交互操作。使用kibana能执行高级的数据分析,并能以图表、表格和地图的形式查看数据。kibana使得理解大容量的数据变得非常容易。它非常简单,基于浏览器的接口使我们能够快速的创建和分享显示elasticsearch查询结果实时变化的仪表盘。 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 接口。可使用它对日志进行高效的搜索、可视化、分析等各种操作。 下载地址为: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分词器和拼音分词器的安装 安装拼音分词器pinyin 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是必须提供的。 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)加载样例数据集 下载样例数据集链接,解压数据到指定目录,然后 ● 创建一个索引库: ● 导入数据: 绝对路径: 相对路径: 注意: 2、索引文档的创建 格式: 例如: 索引名字是:fendo; 通过CURL命令: 通过sense 返回的信息可以看到创建是成功的,并且版本号是1;ES会对记录修改进行版本跟踪,第一次创建记录为1,同一条记录每修改一次就追加1。 至此一条记录就提交到ES中建立了索引,注意HTTP的方法是PUT,不要选择错了。 3、索引文档的查询 ES提供了两种搜索的方式:请求参数方式 和 请求体方式。 A)请求参数方式 其中fendo是查询的索引名称,q后面跟着搜索的条件:q=*表示查询所有的内容 这种方式会把查询的内容放入body中,会造成一定的开销,但是易于理解。在平时的练习中,推荐这种方式。 根据索引时的ID查询的文档的RESTful接口如下 HTTP方法采用GET的形式。 用head看的更直观些: 返回的内容大致如下: 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同步数据库中的数据到ES1、数据同步方式 全量同步与增量同步 2、常用的一些ES同步方法 1)、elasticsearch-jdbc: 严格意义上它已经不是第三方插件。已经成为独立的第三方工具。不支持5.5.1。。。 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" //驱动程序 SQL server数据库Driver ="path/to/jdbc-drivers/sqljdbc4.jar" Oracle数据库Driver ="path/to/jdbc-drivers/ojdbc6-12.1.0.2.jar" DB2数据库//连接具有DB2客户端的Provider实例 PostgreSQL数据库Driver ="path/to/jdbc-drivers/postgresql-9.4.1201.jdbc4.jar" 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爬取数据导入到ESwebmagic主要有两个文件 一个是对爬取页面进行处理,一个是对页面处理之后的数据进行保存: 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 |
|