【ES三周年】腾讯云 x Elasticsearch使用方法及代码

一、什么是Elasticsearch Service(ES)

(1)简介

简单来说,我们的目标是帮助每个人更快地找到所需内容,从需要通过内网获取文档的员工,到在网上购物寻找适合自己鞋子的客户。但从更技术的角度来说,大致描述如下:

Elasticsearch 是一个免费且开放的分布式搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。

Elasticsearch分布式搜索引擎,可以对海量数据进行存储、全文检索、统计分析等,提供了 RESTful API 以及各类语言客户端,可以灵活地按照业务需求进行开发。

(2)Elasticsearch 的用途是什么?

Elasticsearch 在速度和可扩展性方面都表现出色,而且还能够索引多种类型的内容,这意味着其可用于多种用例:

  • 应用程序搜索
  • 网站搜索
  • 企业搜索
  • 日志处理和分析
  • 基础设施指标和容器监测
  • 应用程序性能监测
  • 地理空间数据分析和可视化
  • 安全分析
  • 业务分析

(3)Elasticsearch 的工作原理是什么?

原始数据会从多个来源(包括日志、系统指标和网络应用程序)输入到 Elasticsearch 中。数据采集指在 Elasticsearch 中进行索引之前解析、标准化并充实这些原始数据的过程。这些数据在 Elasticsearch 中索引完成之后,用户便可针对他们的数据运行复杂的查询,并使用聚合来检索自身数据的复杂汇总。在 Kibana 中,用户可以基于自己的数据创建强大的可视化,分享仪表板,并对 Elastic Stack 进行管理。

(4)Elasticsearch 索引是什么?

Elasticsearch 索引指相互关联的文档集合。Elasticsearch 会以 JSON 文档的形式存储数据。每个文档都会在一组(字段或属性的名称)和它们对应的值(字符串、数字、布尔值、日期、数值组、地理位置或其他类型的数据)之间建立联系。

Elasticsearch 使用的是一种名为倒排索引的数据结构,这一结构的设计可以允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。

在索引过程中,Elasticsearch 会存储文档并构建倒排索引,这样用户便可以近实时地对文档数据进行搜索。索引过程是在索引 API 中启动的,通过此 API 您既可向特定索引中添加 JSON 文档,也可更改特定索引中的 JSON 文档。

(5)Logstash 的用途是什么?

Logstash 是 Elastic Stack 的核心产品之一,可用来对数据进行聚合和处理,并将数据发送到 Elasticsearch。Logstash 是一个开源的服务器端数据处理管道,允许您在将数据索引到 Elasticsearch 之前同时从多个来源采集数据,并对数据进行充实和转换。

(6)Kibana 的用途是什么?

Kibana 是一款适用于 Elasticsearch 的数据可视化和管理工具,可以提供实时的直方图、线形图、饼状图和地图。Kibana 同时还包括诸如 Canvas 和 Elastic Maps 等高级应用程序;Canvas 允许用户基于自身数据创建定制的动态信息图表,而 Elastic Maps 则可用来对地理空间数据进行可视化。

(7)为何使用 Elasticsearch?

Elasticsearch 很快。由于 Elasticsearch 是在 Lucene 基础上构建而成的,所以在全文本搜索方面表现十分出色。Elasticsearch 同时还是一个近实时的搜索平台,这意味着从文档索引操作到文档变为可搜索状态之间的延时很短,一般只有一秒。因此,Elasticsearch 非常适用于对时间有严苛要求的用例,例如安全分析和基础设施监测。

(8)Elasticsearch 具有分布式的本质特征。Elasticsearch 中存储的文档分布在不同的容器中,这些容器称为分片,可以进行复制以提供数据冗余副本,以防发生硬件故障。Elasticsearch 的分布式特性使得它可以扩展至数百台(甚至数千台)服务器,并处理 PB 量级的数据。

(9)Elasticsearch 包含一系列广泛的功能。除了速度、可扩展性和弹性等优势以外,Elasticsearch 还有大量强大的内置功能(例如数据汇总和索引生命周期管理),可以方便用户更加高效地存储和搜索数据。

(10)Elastic Stack 简化了数据采集、可视化和报告过程。通过与 Beats 和 Logstash 进行集成,用户能够在向 Elasticsearch 中索引数据之前轻松地处理数据。同时,Kibana 不仅可针对 Elasticsearch 数据提供实时可视化,同时还提供 UI 以便用户快速访问应用程序性能监测 (APM)、日志和基础设施指标等数据。

二、腾讯云 & Elasticsearch Service(ES)

(1)腾讯云ES

腾讯云 Elasticsearch Service(ES)是基于开源搜索引擎 Elasticsearch 打造的高可用、可伸缩的云端全托管的 Elasticsearch 服务,包含 Kibana 及常用插件,并集成了安全、SQL、机器学习、告警、监控等高级特性(X-Pack)。使用腾讯云 ES,您可以快速部署、轻松管理、按需扩展您的集群,简化复杂运维操作,快速构建日志分析、异常监控、网站搜索、企业搜索、BI 分析等各类业务。

通过腾讯云 ES,您可以快速构建海量数据存储搜索、实时日志分析等应用,例如网站搜索导航、企业级搜索、服务日志异常监控、点击流分析等。

(2)腾讯云ES的特点

(3)应用场景

①日志分析

②信息检索

③数据分析

④数据库查询加速

三、优势

四、编程语言

Elasticsearch 使用的是标准的 RESTful 风格的 API 和 JSON。并支持很多语言,具体如下:

(1)C#

代码语言:javascript
复制
var client = new ElasticClient();

var searchResponse = client.Search<Tweet>(s => s
.Index("social-*")
.Query(q => q
.Match(m => m
.Field(f => f.Message)
.Query("myProduct")
)
)
.Aggregations(a => a
.Terms("top_10_states", t => t
.Field(f => f.State)
.Size(10)
)
)
);

(2)GO

代码语言:javascript
复制
es, _ := elasticsearch.NewClient(elasticsearch.Config{
Addresses: []string{"http://localhost:9200"},
})

body := { &#34;query&#34;: { &#34;match&#34;: { &#34;message&#34;: &#34;myProduct&#34; } }, &#34;aggregations&#34;: { &#34;top_10_states&#34;: { &#34;terms&#34;: { &#34;field&#34;: &#34;state&#34;, &#34;size&#34;: 10 } } } }

res, err := es.Search(
es.Search.WithIndex("social-*"),
es.Search.WithBody(strings.NewReader(body)),
es.Search.WithPretty(),
)
if err != nil {
log.Fatalf("Error getting response: %s", err)
}

defer res.Body.Close()

(3)JAVA

代码语言:javascript
复制
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
new HttpHost("localhost", 9200, "http")));

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchSourceBuilder.aggregation(AggregationBuilders.terms("top_10_states").field("state").size(10));

SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("social-*");
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

(4)JAVAScript

代码语言:javascript
复制
const { Client } = require('@elastic/elasticsearch')
const client = new Client({ node: 'http://localhost:9200' })

client
.search({
index: 'social-',
body: {
query: { match: { message: 'myProduct' } },
aggs: {
top_10_states: {
terms: { field: 'state', size: 10 }
}
}
}
})
.then(({ body }) => {
const { hits } = body.hits
console.log(hits)
})
.catch(console.error)

(5)PHP

代码语言:javascript
复制
$esclient = Elasticsearch\ClientBuilder::create()
->setHosts(["localhost:9200"])
->build();
$params = [
'index' => 'social-
',
'body' => [
'query' => [
'match' => ['message' => 'myProduct']
],
'aggs' => [
'top_10_states' => [
'terms' => [
'field' => 'state',
'size' => 10,
]
]
]
]
];
response = esclient->search($params);

(6)Python

代码语言:javascript
复制
from elasticsearch import Elasticsearch

esclient = Elasticsearch(['localhost:9200'])
response = esclient.search(
index='social-*',
body={
"query": {
"match": {
"message": "myProduct"
}
},
"aggs": {
"top_10_states": {
"terms": {
"field": "state",
"size": 10
}
}
}
}
)