文档为何物?一个对象 就相当于mysql的一个record记录
【文档】
什么是文档?
程序中大多的实体或对象能够被序列化为包含键值对的JSON对象,键(key)是字段(field)或属性(property)的名字,值(value)可以是字符串、数字、布尔类型、另一个对象、值数组或者其他特殊类型,比如表示日期的字符串或者表示地理位置的对象。
{ "name": "John Smith", "age": 42, "confirmed": true, "join_date": "2014-06-01", "home": { "lat": 51.5, "lon": 0.1 }, "accounts": [ { "type": "facebook", "id": "johnsmith" }, { "type": "twitter", "id": "johnsmith" } ] }
通常,我们可以认为对象(object)和文档(document)是等价相通的。不过,他们还是有所差别:对象(Object)是一个JSON结构体——类似于哈希、hashmap、字典或者关联数组;对象(Object)中还可能包含其他对象(Object)。 在Elasticsearch中,文档(document)这个术语有着特殊含义。它特指最顶层结构或者根对象(root object)序列化成的JSON数据(以唯一ID标识并存储于Elasticsearch中)。
文档元数据
一个文档不只有数据。它还包含了元数据(metadata)——关于文档的信息。三个必须的元数据节点是:
节点说明
_index文档存储的地方
_type文档代表的对象的类
_id文档的唯一标识
_index
索引(index)类似于关系型数据库里的“数据库”——它是我们存储和索引关联数据的地方。
提示:
事实上,我们的数据被存储和索引在分片(shards)中,索引只是一个把一个或多个分片分组在一起的逻辑空间。然而,这只是一些内部细节——我们的程序完全不用关心分片。对于我们的程序而言,文档存储在索引(index)中。剩下的细节由Elasticsearch关心既可。
我们将会在《索引管理》章节中探讨如何创建并管理索引,但现在,我们将让Elasticsearch为我们创建索引。我们唯一需要做的仅仅是选择一个索引名。这个名字必须是全部小写,不能以下划线开头,不能包含逗号。让我们使用website做为索引名。
_type
在应用中,我们使用对象表示一些“事物”,例如一个用户、一篇博客、一个评论,或者一封邮件。每个对象都属于一个类(class),这个类定义了属性或与对象关联的数据。user类的对象可能包含姓名、性别、年龄和Email地址。
在关系型数据库中,我们经常将相同类的对象存储在一个表里,因为它们有着相同的结构。同理,在Elasticsearch中,我们使用相同类型(type)的文档表示相同的“事物”,因为他们的数据结构也是相同的。+
每个类型(type)都有自己的映射(mapping)或者结构定义,就像传统数据库表中的列一样。所有类型下的文档被存储在同一个索引下,但是类型的映射(mapping)会告诉Elasticsearch不同的文档如何被索引。 我们将会在《映射》章节探讨如何定义和管理映射,但是现在我们将依赖Elasticsearch去自动处理数据结构。
_type的名字可以是大写或小写,不能包含下划线或逗号。我们将使用blog做为类型名。
_id
id仅仅是一个字符串,它与_index和_type组合时,就可以在Elasticsearch中唯一标识一个文档。当创建一个文档,你可以自定义_id,也可以让Elasticsearch帮你自动生成。
其它元数据
还有一些其它的元数据,我们将在《映射》章节探讨。使用上面提到的元素,我们已经可以在Elasticsearch中存储文档并通过ID检索——换言说,把Elasticsearch做为文档存储器使用了。
其他所有程序语言都可以使用RESTful API,通过9200端口的与Elasticsearch进行通信,你可以使用你喜欢的WEB客户端,事实上,如你所见,你甚至可以通过curl
命令与Elasticsearch通信。
NOTE
Elasticsearch官方提供了多种程序语言的客户端——Groovy,Javascript, .NET,PHP,Perl,Python,以及 Ruby——还有很多由社区提供的客户端和插件,所有这些可以在文档中找到。
向Elasticsearch发出的请求的组成部分与其它普通的HTTP请求是一样的:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
VERB HTTP方法:GET
, POST
, PUT
, HEAD
, DELETE
PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用)
HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
PORT Elasticsearch HTTP服务所在的端口,默认为9200
PATH API路径(例如_count将返回集群中文档的数量),PATH可以包含多个组件,例如_cluster/stats或者_nodes/stats/jvm
QUERY_STRING 一些可选的查询请求参数,例如?pretty
参数将使请求返回更加美观易读的JSON数据
BODY 一个JSON格式的请求主体(如果请求需要的话)
举例说明,为了计算集群中的文档数量,我们可以这样做:
curl -XGET 'http://localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } } '
如:返回所有节点jvm信息
curl -i 127.0.0.1:9200/_nodes/stats/jvm?pretty
【API-RESTful API】
参考:
http://www.learnes.net/data/README.html
curl 192.168.100.10:9200?preety curl 192.168.100.10:9200/_count?pretty
shell 中的curl的用法
-X 指定请求方法默认是 -XGET
-i 返回数据的时候,也一并返回请求结果
-d 发送的数据
查看elk的状态:
curl 192.168.100.10:9200/_cluster/health?pretty
这个返回值意味着我们的索引请求已经被成功创建,其中还包含了_index, _type以及_id的元数据,以及一个新的元素_version
_index 名词就是相当于数据库中库
_type 相当于数据库中的表
_id 就是id(可以自己指定也以自增)
_index 和 _type 和 _id 三者组成elasticsearch存储中的数据的唯一
创建一条
curl -XPUT 192.168.100.10:9200/website/blog/123 -d '{ "title": "My first blog entry", "text": "Just trying this out...", "date": "2016/01/01" }'
可以看到搜索到了当时创建的文档
[root@master ~]# curl 192.168.100.10:9200/website/blog/123?pretty { "_index" : "website", "_type" : "blog", "_id" : "123", "_version" : 1, "found" : true, "_source" : { "title" : "My first blog entry", "text" : "Just trying this out...", "date" : "2014/01/01" } }
每找到的情况:
[root@master ~]# curl 192.168.100.10:9200/website/blog/1235?pretty { "_index" : "website", "_type" : "blog", "_id" : "1235", "found" : false }
_source 是文档的内容。可以指定值返回文档指定的字段
[root@master ~]# curl -i -XGET "192.168.100.10:9200/logstash-2016.05.12/syslog/AVSlIBy3bzztddJUaGzh?_source=file,meesage&pretty" HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Content-Length: 185 { "_index" : "logstash-2016.05.12", "_type" : "syslog", "_id" : "AVSlIBy3bzztddJUaGzh", "_version" : 1, "found" : true, "_source" : { "file" : "/var/log/messages" } }
一次获取多个文档_mget
[root@master ~]# curl -i -XGET 192.168.100.10:9200/logstash-2016.05.12/syslog/_mget?pretty -d '{"ids": [ "2", "1"]}' HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Content-Length: 230 { "docs" : [ { "_index" : "logstash-2016.05.12", "_type" : "syslog", "_id" : "2", "found" : false }, { "_index" : "logstash-2016.05.12", "_type" : "syslog", "_id" : "1", "found" : false } ] }
索引多了会积累需要定时删除比如删除一个月之前的,(不能使用rm -rf 删除data下面的索引目录,因为elk是分布式的你输出了,其他节点的复制分片又会同步过来)
# 删除indices
curl -XDELETE "http://localhost:9200/access-log-2016.12.02/"
# 删除多个indices
curl -XDELETE "http://localhost:9200/access-log-2015.12.*/"
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。