ES入门篇

1 ES查询入门

1.1 基础

基于ApacheLucene,RestfulAPI的全文搜索

1.2 特性

分布式实时文件存储、分布式实时搜索引擎、伸缩性、可扩展型、PB级的结构化或非结构化数据处理。

1.3 数据结构层级

RDB: DB______TABLE_ROW_______COLUMN
ES: INDICES_TYPE__DOCUMENT_FIELDS

1.4 搜索方式

1)简单搜索:

GET /megacorp/employee/1    
GET /megacorp/employee/_search 
GET /megacorp/employee/_search?q=last_name:Smith

2)DSL语句:

 GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}

GET /megacorp/employee/_search
{
    "query" : {
        "filtered" : {
            "filter" : {
                "range" : {
                    "age" : { "gt" : 30 } <1>
                }
            },
            "query" : {
                "match" : {
                    "last_name" : "smith" <2>
                }
            }
        }
    }
}
<1> 这部分查询属于区间过滤器(range filter),它用于查找所有年龄大于30岁的数据——gt为"greater than"的缩写。
<2> 这部分查询与之前的match语句(query)一致。

3)全文搜索:(相比于短语搜索更为广泛、内容按相关性排序)

 GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}

4)短语搜索:

 GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}

5)高亮支持:

 GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}

6)聚合:https://es.xiaoleilu.com/010_Intro/35_Tutorial_Aggregations.html
允许在指定条件查询结果的基础上进行统计分析的功能,类似于group by但更为强大;

2 ES数据结构入门

2.1 document:即ES中的一条数据,为JSON obj,但特指根节点的Obj

2.2 文档元数据:除数据外的部分:

_index 文档存储的地方(index数据库)
_type 文档代表的对象的类(class)
_id 文档的唯一标识 3.文档索引:
使用自己的ID
如果你的文档有自然的标识符(例如 user_account字段或者其他值表示文档),你就可以提供自己的 _id,使用这种形式的 index API:

PUT /{index}/{type}/{id}
{
  "field": "value",
  ...
}

2.3 自增ID

如果我们的数据没有自然ID,我们可以让Elasticsearch自动为我们生成。请求结构发生了变化:PUT方法——“在这个URL中存储文档”变成了POST方法——“在这个类型下存储文档”。(译者注:原来是把文档存储到某个ID对应的空间,现在是把这个文档添加到某个_type下)。
URL现在只包含_index和_type两个字段:

POST /website/blog/
{
  "title": "My second blog entry",
  "text":  "Still trying this out...",
  "date":  "2014/01/01"
}

2.4 文档增删改操作~

https://es.xiaoleilu.com/030_Data/25_Update.html

2.5 版本控制

两种锁;
悲观并发控制(Pessimistic concurrency control)
这在关系型数据库中被广泛的使用,假设冲突的更改经常发生,为了解决冲突我们把访问区块化。典型的例子是在读一行数据前锁定这行,然后确保只有加锁的那个线程可以修改这行数据。
乐观并发控制(Optimistic concurrency control):
被Elasticsearch使用,假设冲突不经常发生,也不区块化访问,然而,如果在读写过程中数据发生了变化,更新操作将失败。这时候由程序决定在失败后如何解决冲突。实际情况中,可以重新尝试更新,刷新数据(重新读取)或者直接反馈给用户。
CAS:主要核心为文档中的version字段;
以及外部版本控制系统;

2.6 Mget批处理查询请求

POST /_mget
{
“docs” : [
{
“_index” : “website”,
“_type” : “blog”,
“_id” : 2
},
{
“_index” : “website”,
“_type” : “pageviews”,
“_id” : 1,
“_source”: “views”
}
]
}
事实上,如果所有文档具有相同_index和_type,你可以通过简单的ids数组来代替完整的docs数组:
POST /website/blog/_mget
{
“ids” : [ “2”, “1” ]
}

2.7 批量更新

就像mget允许我们一次性检索多个文档一样,bulk API允许我们使用单一请求来实现多个文档的create、index、update或delete。这对索引类似于日志活动这样的数据流非常有用,它们可以以成百上千的数据为一个批次按序进行索引。
bulk请求体如下,它有一点不同寻常:
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n

这种格式类似于用"\n"符号连接起来的一行一行的JSON文档流(stream)。两个重要的点需要注意:
每行必须以"\n"符号结尾,包括最后一行。这些都是作为每行有效的分离而做的标记。
每一行的数据不能包含未被转义的换行符,它们会干扰分析——这意味着JSON不能被美化打印。

POST /_bulk
{ “delete”: { “_index”: “website”, “_type”: “blog”, “_id”: “123” }} <1>
{ “create”: { “_index”: “website”, “_type”: “blog”, “_id”: “123” }}
{ “title”: “My first blog post” }
{ “index”: { “_index”: “website”, “_type”: “blog” }}
{ “title”: “My second blog post” }
{ “update”: { “_index”: “website”, “_type”: “blog”, “_id”: “123”, “_retry_on_conflict” : 3} }
{ “doc” : {“title” : “My updated blog post”} } <2>

试着批量索引标准的文档,随着大小的增长,当性能开始降低,说明你每个批次的大小太大了。开始的数量可以在1000~5000个文档之间,如果你的文档非常大,可以使用较小的批次。
通常着眼于你请求批次的物理大小是非常有用的。一千个1kB的文档和一千个1MB的文档大不相同。一个好的批次最好保持在5-15MB大小间。

3 ES集群

3.1 基础概念

节点、主节点、集群
节点(node):一个es实例
主节点(master):它将临时管理集群级别的一些变更,例如新建或删除索引、增加或移除节点等。主节点不参与文档级别的变更或搜索,这意味着在流量增长的时候,该主节点不会成为集群的瓶颈。任何节点都可以成为主节点。我们例子中的集群只有一个节点,所以它会充当主节点的角色。
我们能够与集群中的任何节点通信,包括主节点。每一个节点都知道文档存在于哪个节点上,它们可以转发请求到相应的节点上。我们访问的节点负责收集各节点返回的数据,最后一起返回给客户端。这一切都由Elasticsearch处理。

3.2 集群健康度

集群健康(cluster health)。集群健康有三种状态: green、 yellow或 red。
GET /_cluster/health

3.3 添加索引

分片:主分片\复制分片
分片(shard):是最小级别的工作单元,本身就是一个完整的搜索引擎,但每个分片只保存了索引中的一部分;
索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存出多少数据;
主分片的数目从建立索引的时候就固定了,建立索引时可配置其主分片及复制分片数目,
当你的集群扩容或缩小,Elasticsearch将会自动在你的节点间迁移分片,以使集群保持平衡。
集群的健康状态yellow表示所有的主分片(primary shards)启动并且正常运行了——集群已经可以正常处理任何请求——但是复制分片(replica shards)还没有全部可用。事实上所有的三个复制分片现在都是unassigned状态——它们还未被分配给节点。在同一个节点上保存相同的数据副本是没有必要的,如果这个节点故障了,那所有的数据副本也会丢失。
现在我们的集群已经功能完备,但是依旧存在因硬件故障而导致数据丢失的风险。

3.4 集群扩展

一方面可以增加服务器的数目,ES将自动迁徙分片
另一方面可以调节复制分片的数目,以增加冗余,提升容错性

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值