(转)Elasticsearch 入门

elasticsearch是一个是开源的(Apache2协议),分布式的,RESTful的,构建在Apache Lucene之上的的搜索引擎。

它有很多特点例如Schema Free,Document Oriented。它是#nosql的,基于JSON,同时支持多种API,包括HTTP, thrift, memcached。支持HTTP,是比较爽的一点,因为基本上所有的应用都可以用ES了,页面上的js脚本都可以去查询。

1.安装

必须先安装Java环境,如设置 JAVA_HOME => C:\Program Files\Java\jdk1.7.0_18
elasticsearch-rtf 中文入门集成包

使用git签出,下载到本地。windows下,执行bin下面的elasticsearch.bat。linux下,执行bin下面或者service下面elasticsearch

elasticsearch 跟 MySQL 中定义资料格式的角色关系对照表如下

 

ES下载页面下载zip或者tar包后,解压,然后到elasticsearch的目录下,运行下面的命令。

搭建集群也非常简单,在同网段的机器上,启动es后,它们会自动组建成一个集群,并完成数据的分布式存储,查询时也会按照分布式的方式去查找。

下面我们就来看一下ES的HTTP的API的插入、删除、更新、查找、搜索的功能吧,(ES安装在ubuntu server 64位 12.04LTS)。

插入

插入的参数为-XPUT,插入一条记录。

curl:  -X 后面跟 RESTful :  GET, POST …
-d 后面跟数据。 (d = data to send)

从上面的这个例子中,可以看出ES的http的服务的默认端口9200,后面的/sgk/gmail/1是这条记录的索引部分。

这也就体现了它的RESTful风格,所有的记录都是通过URI确定。这三级目录分布对应了_index,_type, _id。实际上ES上存放的所有的记录都只能通过三级目录的方式找到,不能多也不能少。

_id字段可以是数字也可以是字符串。在执行上面的命令时ES会自动创建这些索引。-d后面跟上了要插入的json格式的记录。

-XPUT表明这是插入一条数据,ES中叫创建一个索引。ES返回的结果中,一个_version字段,表明了当前记录的版本号,当你想这个索引重新put一条记录时,版本号会自动加一。

删除

删除的http请求参数为-XDELETE,通过下面的命令可以删除这条记录:

删除这条记录的时候,_verison也会自动加一的。

查询

创建了一个索引后,可以通过下面的方式查询(参数-XGET)出来:

执行上面的查询命令,可以等到下面的结果:

exists表示是否有查询结果,_source字段是查询到的记录。

查询的时候,可以将_type设置成为_all,ES就会返回在_index下所有type中,第一个匹配_id的记录。

还可以通过参数对返回结果继续控制,例如:用fields选取返回的字段,用pretty控制返回的json格式是否更阅读友好。format=yaml可以设置输入格式为YAML。 下面是两个例子

当然ES还支持一次查询多组记录,即multi get,在URI中是使用关键字_mget,具体可以参考ES的文档multi get

更新

ES同样支持更新,但是更新的方式是通过一个提供的脚本进行的。ES的做法是,通过index找到相应的存放记录的节点,然后执行脚本,执行完之后,返回新的索引。实际上执行的是一个get和reindex的过程,在这个过程中,通过versioning来控制没有其它的更新操作(这个功能是0.19后可用的)。具体实现的原理应该和elasticsearch Versioning相关。

get,reindex的含义是,ES先取出这条记录,然后根据新数据生成新记录,然后在把新记录放回到ES中(并不会覆盖老的记录)。

首先创建一条记录

将counter的值加4

也可以添加一个tag的值

现在还支持upsert功能,即在更新的时候,如果记录没有这个key,则插入这个key,下面是一个例子,如果没有counter字段,则插入该字段:

关于update还有其它很多功能,可以参考ES的API update

搜索

elasticsearch的名字里面有一个search,那么主要功能也是search了。

es的search有两种形式,一是通过URI,二是通过Requst Body。通过URI查询,即将查询的语句放入到请求的url中,例如:

第二种方式,即在查询的请求中加入一个doc

query body的定义可以查看query DSL 另外两种查询方式都可以带参数,参数的含义参考URI RequestRequest Body

ES的搜索功能是可以跨index和type的,例如下面这几条命令

第一条是在所有的twitter这个index下的所有type中查找,第二条是在tweet,user这两个type中查找,第三条是在kimchy,elasticsearch这两个index的tweet这个type中查找,第四条使用了_all关键字,是在所有的index的tweet的type中查找,第五条更暴力,在所有的index和type中查找。

查找还有其它的很多选项,sort高亮,选取返回记录的域Fields,还可以对返回的域使用一个脚本进行计算script Fields,或者对返回结果继续统计Facets,Facets的内容比较多,它支持关键词统计,范围内统计,直方图式统计,日期的直方图式统计,过滤,查询,还有记录地理位置距离的统计geo distance。 支持名字过滤Named Filters。 定义搜索类型Search Type 。例如什么Query And Fetch,Query Then Fetch。 索引加速的功能Index Boost,可以让某一个索引的权重大于另外一个。 保持上次检索的环境了结果Scroll。保留每一个命中的score值Explain。 设置命中的min_score。保留版本号Version

Search的参数很多,我也没有一一看,不过果然是名字里面有个search,对检索的各种场景都有支持。

当然还支持多个查询multi search,例如下面这个例子

小结

以上就是elasticsearch的基本的几个功能了。当然它还有其它的很多功能,大家可以上http://www.elasticsearch.org去查看。

ES是基于Lucene的,有很多概念是直接来自于它,所有要想深入学习ES,还得有点Lucene的基础。

总的,感觉elasticsearch是一个比较强大的工具,而且对社交网络的支持比较好,而且使用方便,配置简单,就不知道稳定性如何了。

下面是两篇不错的文章,大家也可以借鉴一下:

还有elasticsearch的中文站点http://www.elasticsearch.cn/,不过这个网站还在构建中,翻译工作也才刚刚开始,大家就期盼早点完成。

ElasticSearch教程(0)——ElasticSearch基本概念

ElasticSearch教程(1)——安装ES和开发环境准备

ElasticSearch教程(2)——ElasticSearch目录结构

  1. 暂无评论

return top