Elasticsearch之基本操作
elasticsearch是一个是开源的(Apache2协议),分布式的,RESTful的,构建在Apache Lucene之上的的搜索引擎。
它有很多特点例如Schema Free,Document Oriented。它是#nosql的,基于JSON,同时支持多种API,包括HTTP, thrift, memcached。支持HTTP,是比较爽的一点,因为基本上所有的应用都可以用ES了,页面上的js脚本都可以去查询。
安装
启动和安装特别简单,在ES下载页面下载zip或者tar包后,解压,然后到elasticsearch的目录下,运行下面的命令就可以了。
bin/elasticsearch -f
搭建集群也非常简单,在同网段的机器上,启动es后,它们会自动组建成一个集群,并完成数据的分布式存储,查询时也会按照分布式的方式去查找。
好了恭喜你,现在你已经可以搭建ES单机版和ES集群了,一切都这么简单。
下面我们就来看一下ES的HTTP的API的插入、删除、更新、查找、搜索的功能吧,(ES安装在ubuntu server 64位 12.04LTS)。
插入
先来一个简单的官方例子,插入的参数为-XPUT
,插入一条记录。
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elastic Search"
}'
执行结果如下图所示,绿色框内的内容是ES返回的执行结果:
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
是这条记录的索引部分。
这也就体现了它的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/,不过这个网站还在构建中,翻译工作也才刚刚开始,大家就期盼早点完成。
Elasticsearch之基本操作的更多相关文章
- Elasticsearch CRUD基本操作
前言 本次我们聊一聊Elasticsearch的基本操作CRUD,他跟我们常用的关系型数据库的操作又有什么不一样的地方呢?今天我们就来好好讲解一番. 说明 本次演示用的版本是7.11. 工具可以使用K ...
- Elasticsearch rest-high-level-client 基本操作
Elasticsearch rest-high-level-client 基本操作 本篇主要讲解一下 rest-high-level-client 去操作 Elasticsearch , 虽然这个客户 ...
- python对接elasticsearch的基本操作
基本操作 #!/usr/bin/env python # -*- coding: utf-8 -*- # author tom from elasticsearch import Elasticsea ...
- ElasticSearch Python 基本操作
创建索引 from elasticsearch import Elasticsearch es = Elasticsearch('192.168.149.96:9200') mappings = { ...
- java操作elasticsearch实现基本的增删改查操作
一.在进行java操作elasticsearch之前,请确认好集群的名称及对应的ES节点ip和端口 1.查看ES的集群名称 #进入elasticsearch.yml配置文件/opt/elasticse ...
- spring boot 整合elasticsearch
1.导入jar包 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncodi ...
- Elasticsearch笔记二之Curl工具基本操作
Elasticsearch笔记二之Curl工具基本操作 简介: Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式.-X指定http请求的方法,-d指定要传输的数据. 创建索 ...
- ElasticSearch 全文检索— ElasticSearch 基本操作
REST 简介-定义 REST (REpresentation State Transfer)描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy Fielding ...
- ElasticSearch之安装及基本操作API
ElasticSearch 是目前非常流行的搜索引擎,对海量数据搜索是非常友好,并且在高并发场景下,也能发挥出稳定,快速特点.也是大数据和索搜服务的开发人员所极力追捧的中间件.虽然 ElasticSe ...
随机推荐
- SQL Server 2008 R2 链接 Oracle 10g
首先sqlserver 链接oracle可以通过两个访问接口: “MSDAORA” 和“OraOLEDB.Oracle” 1.“MSDAORA”访问接口是由Microsoft OLE DB Provi ...
- CF刷题-Codeforces Round #481-D. Almost Arithmetic Progression
题目链接:https://codeforces.com/contest/978/problem/D 题解: 题目的大意就是:这组序列能否组成等差数列?一旦构成等差数列,等差数列的公差必定确定,而且,对 ...
- nginx交替出现404和200
今天在调试接口的时候,发现一个奇怪的问题,服务器接口交替返回404和200错误. 排查的时候发现nginx下有大量的404错误记录,而tomcat有两个,一个有正常的访问记录,而另一个虽然启动正常,但 ...
- 在django中使用django_debug_toolbar
一.概述 django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能. 包括查看执行的sql语句,db查询次数,request,headers,调试概览等. ...
- 1.6 JAVA高并发之线程池
一.JAVA高级并发 1.5JDK之后引入高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发 ...
- 【Pthon入门学习】多级菜单小例子
menu_list = { '北京':{ '昌平':{ '回龙观':{ '和谐家园':{}, '矩阵小区':{}, '北店家园':{} }, '沙河':{ '北街家园1区':{}, '北街家园2区': ...
- Centos7下安装Oracle11g r2
我的centos7是在virtualbox下安装的,安装Oracle安装了好久好久,最开始的时候在网上找的两个文章,按照步骤装,有一篇写着装的时候有灰色的竖线,直接按space键或者鼠标右键close ...
- 无法设置主体sa的凭据
设置允许SQL Server身份登录 1.先用Window方式登陆进去,选择数据库实例,右键选择属性——安全性:把服务器身份验证选项从“Window身份验证模式”改为“SQLServer和Window ...
- zend安装及破解
Zend下载 https://pan.baidu.com/s/1fCfUQ0j7dxEtOzbNnsgODg 破解: 1.打开dmg文件安装,将Zend Studio拖拽至applications进行 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第四周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第四周学习总结 经过这样一个国庆节的假期,心中只有一个想法,这个国庆假期放的,不如不放呢!! 教材学习内容总结 < ...