AWS

来源:互联网 发布:xshell连接linux 编辑:程序博客网 时间:2024/06/08 00:31

Elasticsearch简介

Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎。

Elasticsearch是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard的方式保证数据安全,并且提供自动resharding的功能,加之github等大型的站点也采用Elasticsearch作为其搜索服务。

Amazon Elasticsearch Service 是一项完全托管的服务,可以提供各种易于使用的 Elasticsearch API 和实时功能,还可以实现生产工作负载需要的可用性、可扩展性和安全性。

通过AWS服务,您可以将原始数据快速转变为可付诸实施的分析结果。

通过 AWS 管理控制台,只需几分钟就可以设置和配置 Amazon Elasticsearch Service 域。Amazon Elasticsearch Service 可以为您的域预置所有资源并启动域。本服务可以自动检测并替换出现故障的 Elasticsearch 节点,减少与自管理的基础设施和 Elasticsearch 软件相关的开销(可以简化软件修补、故障恢复、备份和监控等耗时的管理任务。
)。Amazon Elasticsearch Service 让您只需要通过单个 API 调用或在控制台中单击几次就可以轻松扩展集群。利用 Amazon Elasticsearch Service,您可以直接访问 Elasticsearch 开源 API,因此您已经用于现有 Elasticsearch 环境的代码和应用程序均能流畅工作。
Amazon Elasticsearch Service 支持 Logstash 这种开源数据注入、转换和加载工具,还支持 Kibana 这种开源可视化工具。
利用 IAM 策略(AWS Identity and Access Management
),您可以让应用程序安全地访问 Amazon Elasticsearch 集群。

Amazon Elasticsearch Service 内置集成多种其他 AWS 服务,其中包括用于无缝注入数据的 Amazon Kinesis Firehose、AWS IOT 和 Amazon CloudWatch Logs、支持审核功能的 AWS CloudTrail、支持安全功能的 AWS Identity and Access Management (IAM) 以及支持云协调功能的 AWS CloudFormation。


日志分析、全文检索和应用程序监控

日志分析
分析网站、移动设备、服务器、传感器和其他来源生成的非结构化和半结构化日志,用于数字营销、应用程序监控、欺诈检测、广告技术、游戏及 IoT 等多种应用场景。使用 Amazon Kinesis Firehose、Logstash 或 Amazon CloudWatch Logs 来捕捉和预处理日志数据,并将其加载到 Amazon Elasticsearch Service 中。然后,您可以使用 Kibana 和 Elasticsearch 查询 DSL 来搜索、分析与显示数据,以便获取关于用户和应用程序的有价值的信息。


全文搜索
为您的客户提供丰富的搜索与导航体验。Amazon Elasticsearch Service 支持分面功能,让您的客户可以通过输入价格、产品特性和品牌等字段值来缩小搜索结果范围,并且支持创建高级搜索筛选条件、在输入时提供搜索建议以及近乎实时的索引更新。此外,由于 Amazon Elasticsearch Service 可以提供便捷的扩展功能来适应波动的查询量,因此您可以让自己的搜索应用程序具备弹性。


分布式文档存储
通过面向文档并且易于使用的 JSON 存储平台为您的应用程序提供支持。Amazon Elasticsearch Service 可以提供简单的 REST API、快速的性能、强大的搜索功能和无缝扩展能力,因此您可以构建各种高性能应用程序,用于存储与检索数十亿个文档并在一个区域的不同可用区之间复制。


实时应用程序监控
在面向客户的应用程序和网站中采集活动日志。使用 Logstash 将这些日志推送到 Amazon Elasticsearch Service 域。Elasticsearch 会对数据编制索引,并近乎实时地 (在不到一秒内) 将数据提供给分析工具。然后,您可以使用内置 Kibana 插件使数据可视化,并执行中断与问题识别等运行分析工作。凭借 Elasticsearch 的地理空间分析,您可以找出发生问题的地理区域。然后,故障排除小组可以搜索索引并进行统计汇总,以确定根本原因并解决问题。

通过Elasticsearch你能找到什么?
显示提到我的产品的所有帖子 “match”: {“message”: “myProduct”}
按地理位置汇总 “aggregations” :{“my-geo-aggs” :{“geohash_grid” : {“field” : “coordinates”}}}
缩小到美国 “term” : {“country”:”United States”}
以天数汇总数据 “aggregations” : {“per_day_posts” : {“date_histogram”:{“field”:”@timestamp”, ”interval”:“day”}}}
由前3个州分解 “aggregations”:{“by_state”:{“terms”:{“field”:”state”}}}
发现预期,发现意想不到的

使用案例:
· 维基百科使用Elasticsearch来进行全文搜做并高亮显示关键词,以及提供search-as-you-type、did-you-mean等搜索建议功能。
· 英国卫报使用Elasticsearch来处理访客日志,以便能将公众对不同文章的反应实时地反馈给各位编辑。
· StackOverflow将全文搜索与地理位置和相关信息进行结合,以提供more-like-this相关问题的展现。
· GitHub使用Elasticsearch来检索超过1300亿行代码。
· 每天,Goldman Sachs使用它来处理5TB数据的索引,还有很多投行使用它来分析股票市场的变动。
但是Elasticsearch并不只是面向大型企业的,它还帮助了很多类似DataDog以及Klout的创业公司进行了功能的扩展。


文档

在Elasticsearch中,文档这个单词有特殊的含义。它指的是在Elasticsearch中被存储到唯一ID下的由最高级或者根对象 (root object )序列化而来的JSON。

一个文档不只包含了数据。它还包含了元数据(metadata) —— 关于文档的信息。有三个元数据元素是必须存在的,它们是:
_index
文档存储的地方,类似传统的数据库
索引的名字必须要全部小写,也不能以下划线开头,不能包含逗号。我们可以用website作为我们索引的名字。
_type
文档代表的对象种类
使用同样类型的文档来代表同类“事物”
_id
文档的唯一编号
id是一个字符串,当它与_index以及_type组合时,就可以来代表Elasticsearch中一个特定的文档。

使用上面罗列的元素,我们已经可以在Elasticsearch中存储文档或者通过ID来搜索已经保存的文档了。

索引文档
/{index}/{type}/{id}
使用自己的ID-123
curl -XPUT search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/website/blog/123 -d ‘{“title” : “My first blog entry”,”text” : “Just trying this out”,”date” : “2017/08/15”}’

搜索文档
curl -i -XGET search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/website/blog/123?pretty
-i 反馈头文件
用_source得到指定字段
curl -XGET search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/website/blog/123?_source=title,text

只显示_source字段
curl -XGET search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/website/blog/123/_source

检查文档是否存在
curl -i -XHEAD search-fable-7jp2bizxkpgmf3filwo6arfacu.us-e.amazonaws.com/website/blog/123
这个反馈只代表了你查询的那一刻文档不存在,但是不代表几毫秒后它不存在

更新整个文档
在Documents中的文档是不可改变的。使用index API来重新索引或者替换掉它:
curl -XPUT search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/website/blog/123 -d ‘{“title” : “My first blog entry”,”text” : “Just trying this out”,”date” : “2017/08/16”}’

局部更新文档的一部分
curl -XPOST search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/website/blog/AV3lZZwRAfsIV44TjN9R/_update -d ‘{“doc” : “testing”}’
使用脚本进行更新

创建一个文档
让Elasticsearch自动创建不同的_id
curl -XPOST search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/website/blog -d ‘{“title” : “My second blog entry”,”text” : “Just trying this out”,”date” : “2017/08/15”}’

我们可能已经决定好了_id,所以需要告诉Elasticsearch只有当_index,_type以及_id这3个属性全部相同的文档不存在时才接受我们的请求。实现这个目的有两种方法
第一种是在查询中添加op_type参数:
curl -XPUT search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/website/blog/123?op_type=create -d ‘{“title” : “My second blog entry”,”text” : “Just trying this out”,”date” : “2017/08/15”}’

或者在请求最后添加 /_create:
curl -XPUT search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/website/blog/123/_create -d ‘{“title” : “My second blog entry”,”text” : “Just trying this out”,”date” : “2017/08/15”}’

删除一个文档
curl -XDELETE search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/website/blog/123

两种能避免在并发更新时丢失数据的方法:

悲观并发控制(PCC)
这一点在关系数据库中被广泛使用。假设这种情况很容易发生,我们就可以阻止对这一资源的访问。典型的例子就是当我们在读取一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修改这一行数据。
乐观并发控制(OCC)
Elasticsearch所使用的。假设这种情况并不会经常发生,也不会去阻止某一数据的访问。然而,如果基础数据在我们读取和写入的间隔中发生了变化,更新就会失败。这时候就由程序来决定如何处理这个冲突。例如,它可以重新读取新数据来进行更新,又或者它可以将这一情况直接反馈给用户。
所有的有关于更新或者删除文档的API都支持version这个参数,有了它你就通过修改你的程序来使用乐观并发控制。

获取多个文档(Mget)
将多个请求合并到一个请求中以节省网络开销。
使用multi-get 或者 mget API来取代一篇又一篇文档的获取多个文档。
mgetAPI需要一个docs数组,每一个元素包含你想要的文档的_index, _type以及_id。你也可以指定_source参数来设定你所需要的字段。
curl -XGET ‘search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/_mget’ -d ‘{“docs” : [{“_index” : “movies”, “_type” : “movie”, “_id” : “tt0116996”}]}’

批量处理多个请求(Bulk)

{ action: { metadata }}\n
{ request body }\n
action/metadata 行指定了将要在哪个文档中执行什么操作。其中action必须是index, create, update或者delete。metadata 需要指明需要被操作文档的_index, _type以及_id
POST /_bulk
{ “delete”: { “_index”: “website”, “_type”: “blog”, “_id”: “123” }}
{ “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”} }
curl -XPOST ‘localhost:9200/_bulk?pretty’ -H ‘Content-Type: application/json’ -d’
{ “index” : { “_index” : “test”, “_type” : “type1”, “_id” : “1” } }
{ “field1” : “value1” }
{ “delete” : { “_index” : “test”, “_type” : “type1”, “_id” : “2” } }
{ “create” : { “_index” : “test”, “_type” : “type1”, “_id” : “3” } }
{ “field1” : “value3” }
{ “update” : {“_id” : “1”, “_type” : “type1”, “_index” : “test”} }
{ “doc” : {“field2” : “value2”} }

curl -XPUT search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/movies/movie/tt0116996 -d ‘{“directors” : [“Tim Burton”],”genres” : [“Comedy”,”Sci-Fi”],”plot” : “The Earth is invaded by Martians with irresistible weapons and a cruel sense of humor.”,”title” : “Mars Attacks!”,”actors” : [“Jack Nicholson”,”Pierce Brosnan”,”Sarah Jessica Parker”],”year” : 1996}’

Document CRUD APIs
Single document APIs
以下简写代码在Console - kibana下运行
https://search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/_plugin/kibana/app/kibana#/dev_tools/console?_g=()

•   Index API

索引文件使之能够被搜索
PUT twitter/tweet/1
{
“user” : “kimchy”,
“post_date” : “2009-11-15T14:12:12”,
“message” : “trying out Elasticsearch”
}

自动创建索引

版本

操作类型
PUT twitter/tweet/1?op_type=create
{
“user” : “kimchy”,
“post_date” : “2009-11-15T14:12:12”,
“message” : “trying out Elasticsearch”
}

PUT twitter/tweet/1/_create
{
“user” : “kimchy”,
“post_date” : “2009-11-15T14:12:12”,
“message” : “trying out Elasticsearch”
}

自动ID生成(POST)
路由

curl -XPOST ‘http://search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com//twitter/tweet?routing=kimchy&pretty’ -H ‘Content-Type: application/json’ -d’
{
“user” : “kimchy”,
“post_date” : “2009-11-15T14:12:12”,
“message” : “trying out Elasticsearch”
}

超时
PUT twitter/tweet/1?timeout=5m
{
“user” : “kimchy”,
“post_date” : “2009-11-15T14:12:12”,
“message” : “trying out Elasticsearch”
}

•   Get API

GET twitter/tweet/0
检查文档的存在
HEAD twitter/tweet/0

实时

可选类型

源过滤
GET twitter/tweet/0?_source=false
GET twitter/tweet/0?_source_include=*.id&_source_exclude=entities
GET twitter/tweet/0?_source=*.id,retweeted
获取_source
GET twitter/tweet/1/_source
GET twitter/tweet/1/_source?_source_include=*.id&_source_exclude=entities’

路由
GET twitter/tweet/2?routing=user1

•   Delete API

DELETE / twitter / tweet / 1

路由
DELETE /twitter/tweet/1?routing=kimchy

•   Update API

脚本更新
POST test/type1/1/_update
{
“script” : {
“inline”: “ctx._source.counter += params.count”,
“lang”: “painless”,
“params” : {
“count” : 4
}
}
}

Multi-document APIs

•   Multi Get API•   Bulk API•   Delete By Query API•   Update By Query API•   Reindex API

空白搜索
http://search-fable-7jp2bizxkpgmf3filwo6arfacu.us-east-2.es.amazonaws.com/_search

多索引多类型
URL
说明
/_search
搜索所有的索引和类型
/gb/_search
搜索索引gb中的所有类型
/gb,us/_search
搜索索引gb以及us中的所有类型
/g*,u*/_search
搜索所有以g或u开头的索引中的所有类型
/gb/user/_search
搜索索引gb中类型user内的所有文档
/gb,us/user,tweet/_search
搜索索引gb和 索引us中类型user以及类型tweet内的所有文档
/_all/user,tweet/_search
搜索所有索引中类型为user以及tweet内的所有文档

分页

size
每次返回多少个结果,默认值为10
from
忽略最初的几条结果,默认值为0

在分布式系统中,大页码请求所消耗的系统资源是呈指数式增长的。这也是为什么网络搜索引擎不会提供超过1,000条搜索结果的原因。

AWS CLI
提供与 AWS 服务交互的命令

Amazon ES 包括下列功能:
· 多种 CPU、内存和存储容量配置,也称为实例类型
· 使用 Amazon EBS 卷作为数据存储卷
· 资源具有多个地理位置,也称为区域和可用区
· 在同一区域的两个可用区之间进行群集节点分配,也称为区域感知
· 通过 AWS Identity and Access Management (IAM) 访问控制确保安全性
· 使用专用主节点提高群集稳定性
· 使用域快照来备份和恢复 Amazon ES 域并跨可用区复制域
· 使用 Kibana 工具实现数据可视化
· 与 Amazon CloudWatch 集成,用于监控 Amazon ES 域指标
· 与 AWS CloudTrail 集成以审核对 Amazon ES 域的配置 API 调用


PHP elastic

将原始数据快速转变为可付诸实施的分析结果。

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.4.2.zip
unzip elasticsearch-1.4.2.zip
cd elasticsearch-1.4.2
./bin/elasticsearch

与REST API紧密匹配

安装
{
“require”: {
“elasticsearch/elasticsearch”: “~5.0”
}
}
安装作曲家和客户端
curl -s http://getcomposer.org/installer | php
php composer.phar install –no-dev

在项目中使用,需要解决如下问题:
1. 索引,对于需要搜索的数据,如何建立合适的索引,还需要根据特定的语言使用不同的analyzer等。
2. 搜索,Elasticsearch提供了非常强大的搜索功能,如何写出高效的搜索语句?
3. 数据源,如何将MySQL的数据导入到Elasticsearch?

对于1和2,主要的工作就是根据业务场景设计好对应的mapping以及search语句就可以了,当然实际不可能这么简单,需要我们不断的调优。对于3,则是需要一个工具将MySQL的数据导入Elasticsearch,因为我们对搜索实时性要求很高,所以需要将MySQL的增量数据实时导入,笔者唯一能想到的就是通过row based binlog来完成。而近段时间的工作,也就是实现一个MySQL增量同步到Elasticsearch的服务。

索引文档
在elasticsearch-php中,几乎所有内容都由关联数组组成。要索引文档,我们需要指定四个信息:索引,类型,标识和文档正文。这是通过构造一个关键字:值对的关联数组完成的。请求体本身是一个关联数组,其中键:值对对应于文档中的数据。
$params = [
‘index’ => ‘my_index’,
‘type’ => ‘my_type’,
‘id’ => ‘my_id’,
‘body’ => [‘testField’ => ‘abc’]
];

response=client->index(params);printr(response);

所有核心操作都可以在client使client->indices()和$client->cluster()对象之下。

PHP语言客户端
1. esclient=Elasticsearch\ClientBuilder::create()2.>setHosts([localhost:9200])3.>build();4.params = [
5. ‘index’ => ‘social-*’,
6. ‘body’ => [
7. ‘query’ => [
8. ‘match’ => [ ‘message’ => ‘myProduct’ ]
9. ],
10. ‘aggs’ => [
11. ‘top_10_states’ => [
12. ‘terms’ => [
13. ‘field’ => ‘state’,
14. ‘size’ => 10,
15. ]
16. ]
17. ]
18. ]
19. ];
20. response=esclient->search($params);

原创粉丝点击