elasticsearch是一个是开源的(Apache2协议),分布式的,RESTful的,构建在Apache Lucene之上的的搜索引擎。javascript
它有不少特色例如Schema Free,Document Oriented。它是#nosql的,基于JSON,同时支持多种API,包括HTTP, thrift, memcached。支持HTTP,是比较爽的一点,由于基本上全部的应用均可以用ES了,页面上的js脚本均可以去查询。html
启动和安装特别简单,在ES下载页面下载zip或者tar包后,解压,而后到elasticsearch的目录下,运行下面的命令就能够了。java
bin/elasticsearch -f
搭建集群也很是简单,在同网段的机器上,启动es后,它们会自动组建成一个集群,并完成数据的分布式存储,查询时也会按照分布式的方式去查找。sql
好了恭喜你,如今你已经能够搭建ES单机版和ES集群了,一切都这么简单。apache
下面咱们就来看一下ES的HTTP的API的插入、删除、更新、查找、搜索的功能吧,(ES安装在ubuntu server 64位 12.04LTS)。json
先来一个简单的官方例子,插入的参数为-XPUT
,插入一条记录。ubuntu
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elastic Search" }'
执行结果以下图所示,绿色框内的内容是ES返回的执行结果:api
andrew@ubuntu:~$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{> "user" : "kimchy",> "post_date" : "2009-11-15T14:12:12",> "message" : "trying out Elastic Search"> }'{"ok":true,"_index":"twitter","_type":"tweet","_id":"1","_version":6}andrew@ubuntu:~$
从上面的这个例子中,能够看出ES的http的服务的默认端口9200,后面的/twitter/tweet/1
是这条记录的索引部分。bash
这也就体现了它的RESTful风格,全部的记录都是经过URI肯定。这三级目录分布对应了_index
,_type
, _id
(绿框内能够看出来)。实际上ES上存放的全部的记录都只能经过三级目录的方式找到,不能多也不能少。网络
_id
字段能够是数字也能够是字符串。在执行上面的命令时ES会自动建立这些索引。-d
后面跟上了要插入的json格式的记录。
-XPUT
代表这是插入一条数据,ES中叫建立一个索引。ES返回的结果中,一个_version
字段,代表了当前记录的版本号,当你想这个索引从新put一条记录时,版本号会自动加一。
删除的http请求参数为-XDELETE
,经过下面的命令能够删除这条记录:
curl -XDELETE 'http://localhost:9200/twitter/tweet/1'
删除这条记录的时候,_verison
也会自动加一的。
建立了一个索引后,能够经过下面的方式查询(参数-XGET
)出来:
curl -XGET 'http://localhost:9200/twitter/tweet/1'
执行上面的查询命令,能够等到下面的结果:
andrew@ubuntu:~$ curl -XGET 'http://localhost:9200/twitter/tweet/1' {"_index":"twitter","_type":"tweet","_id":"1","_version":5,"exists":true, "_source" : { "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elastic Search" }}andrew@ubuntu:~$
exists
表示是否有查询结果,_source
字段是查询到的记录。
查询的时候,能够将_type
设置成为_all
,ES就会返回在_index
下全部type中,第一个匹配_id
的记录。
还能够经过参数对返回结果继续控制,例如:用fields选取返回的字段,用pretty控制返回的json格式是否更阅读友好。format=yaml
能够设置输入格式为YAML。 下面是两个例子
curl -XGET 'http://localhost:9200/twitter/tweet/1?fields=message,user&pretty=true'curl -XGET 'http://localhost:9200/twitter/tweet/1?fields=message,user&format=yaml'
固然ES还支持一次查询多组记录,即multi get,在URI中是使用关键字_mget
,具体能够参考ES的文档multi get。
ES一样支持更新,可是更新的方式是经过一个提供的脚本进行的。ES的作法是,经过index找到相应的存放记录的节点,而后执行脚本,执行完以后,返回新的索引。实际上执行的是一个get和reindex的过程,在这个过程当中,经过versioning来控制没有其它的更新操做(这个功能是0.19后可用的)。具体实现的原理应该和elasticsearch Versioning相关。
get,reindex的含义是,ES先取出这条记录,而后根据新数据生成新记录,而后在把新记录放回到ES中(并不会覆盖老的记录)。
首先建立一条记录
$ curl -XPUT localhost:9200/test/type1/1 -d '{ "counter" : 1, "tags" : ["red"] }'
将counter的值加4
$ curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "script" : "ctx._source.counter += count", "params" : { "count" : 4 } }'
也能够添加一个tag的值
$ curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "script" : "ctx._source.tags += tag", "params" : { "tag" : "blue" } }'
如今还支持upsert功能,即在更新的时候,若是记录没有这个key,则插入这个key,下面是一个例子,若是没有counter
字段,则插入该字段:
$ curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "script" : "ctx._source.counter += count", "params" : { "count" : 4 }, "upsert" : { "counter" : 1 } }'
关于update还有其它不少功能,能够参考ES的API update
elasticsearch的名字里面有一个search,那么主要功能也是search了。
es的search有两种形式,一是经过URI,二是经过Requst Body。经过URI查询,即将查询的语句放入到请求的url中,例如:
curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:kimchy'
第二种方式,即在查询的请求中加入一个doc
$ curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{ "query" : { "term" : { "user" : "kimchy" } } }'
query body的定义能够查看query DSL 另外两种查询方式均可以带参数,参数的含义参考URI Request和Request Body。
ES的搜索功能是能够跨index和type的,例以下面这几条命令
curl -XGET 'http://localhost:9200/twitter/_search?q=user:kimchy'curl -XGET 'http://localhost:9200/twitter/tweet,user/_search?q=user:kimchy'curl -XGET 'http://localhost:9200/kimchy,elasticsearch/tweet/_search?q=tag:wow'curl -XGET 'http://localhost:9200/_all/tweet/\_search?q=tag:wow'curl -XGET 'http://localhost:9200/\_search?q=tag:wow'
第一条是在全部的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,例以下面这个例子
$ cat requests {"index" : "test"} {"query" : {"match_all" : {}}, "from" : 0, "size" : 10} {"index" : "test", "search_type" : "count"} {"query" : {"match_all" : {}}} {} {"query" : {"match_all" : {}}} $ curl -XGET localhost:9200/_msearch --data-binary @requests; echo
以上就是elasticsearch的基本的几个功能了。固然它还有其它的不少功能,你们能够上http://www.elasticsearch.org去查看。
ES是基于Lucene的,有不少概念是直接来自于它,全部要想深刻学习ES,还得有点Lucene的基础。
总的,感受elasticsearch是一个比较强大的工具,并且对社交网络的支持比较好,并且使用方便,配置简单,就不知道稳定性如何了。
下面是两篇不错的文章,你们也能够借鉴一下:
还有elasticsearch的中文站点http://www.elasticsearch.cn/,不过这个网站还在构建中,翻译工做也才刚刚开始,你们就期盼早点完成。