Elasticsearch详解(一)

Java API

Elasticsearch 为Java用户提供两种内置客户端:

节点客户端(node client):

节点客户端已无数据节点(none data node)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。

传输客户端(transport client):

这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单的转发请求给集群中的节点。

 

两个Java客户端都通过9300端口与集群交互,使用Elasticsearch 传输协议(Elasticsearch Transport Protocol)。集群中的节点 之间通过9300端口进行通信。如果此端口为开发,你的节点 讲不能组成集群。

tip:Java客户端所在的Elasticsearch版本必须与集群中其他节点一致,否则,它们可能互相无法识别。

基于HTTP协议,一JSON为数据交互格式的RESTFUL API

其他所有程序语言都可以使用RESTFUL API,通过9200端口与Elasticsearch进行通信,你可以使用你喜欢的WEB客户端,事实上,如你所见,你甚至可以通过curl命令与Elasticsearch通信

NOTE Elasticsearch官方提供了多种程序语言的客户端 ---——Groovy,Javascript, .NET,PHP,Perl,Python,以及 Ruby——还有很多由社区提供的客户端和插件,所有这些可以在文档中找到。

向Elasticsearch 发出请求的组成部分与其他普通的HTTP请求是一样的:

curl -X<verb> <PROTOCOL>://<HOST>/<PATH>?<QUERY_STRING> -d<BODY>

verb HTTP 方法:GET , POST, PUT, HEAD, DELETE

PROTOCOL HTTP或者HTTPS协议(只有在Elasticsearch 前面有https代理的时候可用)

HOST Elasticsearch集群中的任何一个节点主机名,如果在本地节点,那么就叫localhost

PORT Elasticsearch http服务所在的端口 默认为9200

QUERY_STRING 一些可选的查询请求参数,例如?pretty参数讲请求返回更加美观易读的JSON数据

BODY 一个JSON格式的请求主体(如果请求需要的话)

举例说明,为了计算集群中的文档数据量,我们可以这样做:

curl -XGET http://localhost:9200/_count?pretty? -d

{

  "query":{

    "math_all":{}

  }

}

Elasticsearch返回一个类似 200 OK 的HTTP状态码和JSON格式的响应主体(除了 HEAD 请求)。上面的请求会得到如下的
JSON格式的响应主体:
{
"count" : 0,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
}
}

面向文档

应用中的对象很少只是简单的键值列表,更多时候,它拥有复杂的数据结构,比如包含日期、地理位置、另一个对象或者数组。

总有一天,你会想把这些对象存储到数据库中。将这些数据保存到由行和列组成的关系数据库中,就好像是把一个丰富,信息表现力强的对象 拆散了放入一个非常大的表格中:你不得不拆散对象以适应表模式(通常一列表示一个字段),然后又不得不在查询的时候重建它们。

Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档。然而它不仅仅是存储,还会索引每个文档的内容之所以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这种理解数据的方式与以往完全不同,这也是Elasticsearch能够执行复杂的全文搜索的原因之一。

JSON

Elasticsearch 使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NOSQL领域的标准格式。它简洁、简单且容易阅读。

{
  "email": "john@smith.com",
  "first_name": "John",
  "last_name": "Smith",
  "info": {
    "bio": "Eco-warrior and defender of the weak",
    "age": 25,
    "interests": [ "dolphins", "whales" ]
      },
  "join_date": "2014/05/01"
}
尽管原始的user对象很复杂,但它的结构和对象的含义已经被完整的体现在JSON中了在Elasticsearch中将对象转化为JSON 并做索引要比在biao结构中做相同的事情简单的多

NOTE

尽管几乎所有的语言都有相应的模块用于将任意数据结构转换为JSON,但每种语言处理细节不同。具体请查看serialization or marshalling 两个用于处理JSON的模块。Elasticsearch官方客户端会自动为你序列化和反序列化JSON

 

Relational DB --> Databases -->Tables --> Rows --> Columns
Elasticsearch --> Indices -->Types --> Documents --> Fieds

Elasticsearch致力于隐藏分布式系统的复杂性。以下这些操作都是在底层自动
完成的:

1、将你的文档分区到不同的容器或者分片(shards)中,它们可以存在于一个或
多个节点中。

2、将分片均匀的分配到各个节点,对索引和搜索做负载均衡。

3、冗余每一个分片,防止硬件故障造成的数据丢失。

将集群中任意一个节点上的请求路由到相应数据所在的节点。

4、无论是增加节点,还是移除节点,分片都可以做到无缝的扩展和迁移。

Elasticsearch 是一种分布式数据存储引擎,实时存储并检索复杂数据结构---
序列化的JSON文档。分片在索引创建的时候被指定,此后主分片不可变,复制分
片可以改变,复制分片:应对故障,防止丢失数据。w

文档

对象是一个JSON结构体。文档特指最顶层结构或者跟对象序列化成的JSON
数据(以唯一ID标识并存储于Elasticsearch中)

一个文档不只有数据。它还包含了元数据,三个必须的元数据节点:

_index

我们的数据被存储和索引在分片(shards)中,索引只是一个把一个或多个分片分组在一起的逻辑空间

命名规则:这个名字必须是全部小写,不能以下划线开头,不能包含逗

_type

_type 的名字可以是大写或小写,不能包含下划线或逗号。

_id

id仅仅是一个字符串,它与 _index 和 _type 组合时,就可以在ELasticsearch中唯一标识一个文档。当创建一个文档,你可以
自定义 _id ,也可以让Elasticsearch帮你自动生成。

 自动生成的ID有22个字符长,URL-safe, Base64-encoded string universally unique identifiers, 或者叫 UUIDs

posted @ 2016-03-15 16:15  hello嘿嘿嘿!  阅读(2677)  评论(0编辑  收藏  举报