ElasticSearch:可扩展的开源弹性搜索解决方案开源的分布式搜索引擎支持时间时间索引和全文检索。索引:index存放数据类型:type区分储存的对象文档:document储存的主要实体页面:field角色关系对照elasticsearch跟MySQL中定义资料格式的角色关系对照表如下MySQLelasticsearchdatabaseindextabletypetableschemamappingrowdocumentfieldfield=title:嘉禾县基本烟田土地整理施工ElasticSearch官网:先上一张elasticsearch的总体框架图:ElasticSearch是基于Lucene开发的分布式搜索框架,包含如下特性:分布式索引、搜索索引自动分片、负载均衡自动发现机器、组建集群支持Restful风格接口配置简单等。下图是ElasticSearch的第三方插件管理工具,通过它可以很清晰的看到它索引分布的情况:哪块分布在那里,占用空间多少都可以看到,并且可以管理索引。当一台机挂了时,整个系统会对挂机里的内容重新分配到其它机器上,当挂掉的机重新加入集群时,又会重新把索引分配给它。当然,这些规则都是可以根据参数进行设置的,非常灵活。ElasticSearch是先把索引的内容保存到内存之中,当内存不够时再把索引持久化到硬盘中,同时它还有一个队列,是在系统空闲时自动把索引写到硬盘中。的后端存储方式可以有一下四种:1.像普通的Lucene索引,存储在本地文件系统中;2.存储在分布式文件系统中,如freeds;3.存储在Hadoop的hdfs中;4.存储在亚马逊的S3云平台中。它支持插件机制,有丰富的插件。比如和mongoDB、couchDB同步的river插件,分词插件,Hadoop插件,脚本支持插件等。下面介绍elasticsearch的几个概念:cluster代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,与任何一个节点的通信和与整个es集群通信是等价的。在配置文件中可以配置集群的名字,在同一局域网内的机器,配置相同的cluster名字,将会自动组建集群,不需要其它特殊配置。shards代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。replicas代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。recovery代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。river代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB、RabbitMQ、Twitter、Wikipedia。gateway代表es索引的持久化存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。当这个es集群关闭再重新启动时就会从gateway中读取索引数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。discovery.zen代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。Transport代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。1、elasticsearch安装elasticsearch的安装超级easy,解压即用(要事先安装好java环境)。到官网运行包;下载完解开有三个包:bin是运行的脚本,config是设置文件,lib是放依赖的包。plugins的文件夹,把插件放到这个文件夹中。Linux环境下直接运行bin/elasticsearch就开启了;windows运行bin/elasticsearch.bat。如果是在局域网中运行elasticsearch集群也是很简单的,只要配置文件中cluster.name设置一致,并且机器在同一网段下,启动的elasticsearch会自动发现对方,组成集群。浏览器中运行:查看是否安装成功,ES的默认端口是9200;可以看到我使用的是1.3.2版本;这个版本是局域lucene4.9开发的。2、head插件安装与使用进入到安装目录的bin下面,运行以下命令:plugin-installmobz/elasticsearch-head测试:这个插件可以查看索引的情况,可以对索引进行管理。从下图看到我已经创建了两份索引,如果第一次没有创建索引看到的将是空的。1、RESTful接口使用方法为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口。RESTful接口URL的格式:[id]其中index、type是必须提供的。id是可选的,不提供es会自动生成。index、type将信息进行分层,利于管理。index可以理解为数据库;type理解为数据表;id相当于数据库表中记录的主键,是唯一的。2、索引文档的创建将如下一条歌曲信息的数据提交到ES中创建索引:[plain]viewplaincopy1.url::{number:32768,singer:杨坤,size:5109132,song:今夜二十岁,tag:中国好声音,timelen:319}索引名字是:song001;索引的类型是:list001;本记录的id是:1返回的信息可以看到创建是成功的,并且版本号是1;ES会对记录修改进行版本跟踪,第一次创建记录为1,同一条记录每修改一次就追加1。至此一条记录就提交到ES中建立了索引,注意HTTP的方法是PUT,不要选择错了。3、索引文档的查询根据索引时的ID查询的文档的RESTful接口如下url:方法采用GET的形式。4、索引文档的更新根据索引时的ID更新的文档的内容其RESTful接口如下url:方法采用PUT的形式。将歌手名由“杨坤”改成“杨坤独唱”;结果中的version字段已经成了2,因为我们这是是修改,索引版本递增;created字段是false,表示这次不是新建而是更新。更新接口与创建接口完全一样,ES会查询记录是否存在,如果不存在就是创建,存在就是更新操作。5、索引文档的删除根据索引时的ID更新的文档的内容其RESTful接口如下url:方法采用DELETE的形式。删除过后,再通过查询接口去查询将得不到结果。总结:增删改查的RESTful接口URL形式:[id]增删改查分别对应:HTTP请求的PUT、GET、DELETE方法。PUT调用是如果不存在就是创建,已存在是更新。1、首先将如下数据提交到ES中建立索引{number:32768,singer:杨坤,size:5109132,song:今夜二十岁,tag:中国好声音,timelen:319}{number:32769,singer:汪峰,size:6001697,song:我爱你中国,tag:中国好声音,timelen:375}{number:32780,singer:汪峰,size:4070469,song:我如此爱你,tag:中国好声音,timelen:254}{number:32796,singer:大小姐,size:3046005,song:登大人,tag:儿歌,timelen:190}{number:32896,singer:Bandari,size:3869593,song:TheGoldenLand,tag:胎教音乐,timelen:241}{number:32977,singer:Bandari,size:3477514,song:ChildhoodMemory,tag:欧美,timelen:217}2、ElasticSearch'squeryDSL搜索的RESTful接口是_searchURL形式:查询语句通过POST的方式发送到ES。a、基本的全文检索查找索引库中包含音乐的记录{query:{query_string:{query:音乐}}}b、指定字段进行检索查找song字段中含有中国的记录{query:{query_string:{query:中国,fields:[song]}}}c、多字段权重查询在song、tag两个字段中搜索关键字“中国”,如果在song字段中出现权重是2,tag中是默认的1。通过结果可以看到歌曲名中含有中国是排在前面。{query:{multi_match:{query:中国,fields:[song^2,tag]}}}一、总论根据定义:Lucene是一个高效的,基于Java的全文检索库。所以在了解Lucene之前要费一番工夫了解一下全文检索。那么什么叫做全文检索呢?这要从我们生活中的数据说起。我们生活中的数据总体分为两种:结构化数据和非结构化数据。结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。当然有的地方还会提到第三种,半结构化数据,如XML,HTML等,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。非结构化数据又一种叫法叫全文数据。按照数据的分类,搜索也分为两种:对结构化数据的搜索:如对数据库的搜索,用SQL语句。再如对元数据的搜索,如利用windows搜索对文件名,类型,修改时间进行搜索等。对非结构化数据的搜索:如利用windows的搜索也可以搜索文件内容,Linux下的grep命令,再如用Google和百度可以搜索大量内容数据。对非结构化数据也即对全文数据的搜索主要有两种方法:一种是顺序扫描法(SerialScanning):所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相当的慢。如果你有一个