阅前准备知识
学习 Elasticsearch (简称 ES) 的查询方式,建议从以下几个步骤入手:
- 理解 Elasticsearch 的基础概念
首先要了解 Elasticsearch 的核心概念,例如:
- Index(索引):相当于数据库中的表,每个索引中存储着类似类型的数据。
- Document(文档):相当于数据库中的一行数据,每个文档以 JSON 格式存储。
- Shard(分片)和 Replica(副本):理解分片和副本有助于掌握数据的分布和冗余策略。
- 学习 DSL(Domain-Specific Language)查询语法
ES 提供了一种基于 JSON 的查询语言,称为 DSL。学习这部分时,主要包括:
- 基本查询:如
match、term、range查询。 - 布尔查询:如
must、should、filter这些条件组合。 - 聚合查询:如
terms聚合、avg聚合等,用于统计数据。
示例:
查询包含某个词的文档:
{
"query": {
"match": {
"field_name": "keyword"
}
}
}
- 深入掌握过滤和分页
查询通常会使用过滤器来优化性能,学会如何通过 filter 语句来减少不必要的计算。
{
"query": {
"bool": {
"filter": [
{
"term": {
"status": "active"
}
}
]
}
}
}
- 理解全文检索和评分机制
Elasticsearch 的优势在于它的全文检索能力,理解倒排索引(Inverted Index)和评分机制(Relevance Scoring),可以帮助你构建更加精准的查询。
- 学习聚合(Aggregations)
聚合查询是 Elasticsearch 强大的功能之一,能够进行复杂的数据统计和分析:
- terms 聚合:统计字段的不同值的数量。
- date_histogram 聚合:按日期区间统计数据。
- nested 聚合:处理嵌套对象的聚合查询。
示例: 按字段统计每个值的文档数量:
{
"aggs": {
"group_by_status": {
"terms": {
"field": "status"
}
}
}
}
Elasticsearch 交互格式
所有其他语言可以使用 RESTful API 通过端口 9200 和 Elasticsearch 进行通信,你可以用你最喜爱的 web 客户端访问 Elasticsearch 。事实上,正如你所看到的,你甚至可以使用
curl命令来和 Elasticsearch 交互。
一个 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 格式的请求体 (如果请求需要的话) |
测试 Elasticsearch 是否启动成功
curl 'http://localhost:9200/?pretty'
计算集群中文档的数量
curl -X GET "localhost:9200/_count?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
'
索引员工文档
第一个业务需求是存储员工数据。 这将会以 员工文档 的形式存储:一个文档代表一个员工。存储数据到 Elasticsearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。
一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。
Index Versus Index Versus Index
你也许已经注意到 索引 这个词在 Elasticsearch 语境中有多种含义, 这里有必要做一些说明:
索引(名词):
如前所述,一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或 indexes 。
索引(动词):
索引一个文档 就是存储一个文档到一个 索引 (名词)中以便被检索和查询。这非常类似于 SQL 语句中的
INSERT关键词,除了文档已存在时,新文档会替换旧文档情况之外。倒排索引:
关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。
+ 默认的,一个文档中的每一个属性都是 被索引 的(有一个倒排索引)和可搜索的。一个没有倒排索引的属性是不能被搜索到的。我们将在 倒排索引 讨论倒排索引的更多细节。
对于员工目录,我们将做如下操作:
- 每个员工索引一个文档,文档包含该员工的所有信息。
- 每个文档都将是
employee类型 。 - 该类型位于 索引
megacorp内。 - 该索引保存在我们的 Elasticsearch 集群中。
实践中这非常简单(尽管看起来有很多步骤),我们可以通过一条命令完成所有这些动作:
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
或
curl -X PUT "localhost:9200/megacorp/employee/1?pretty" -H 'Content-Type: application/json' -d'
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
'
请求体 —— JSON 文档 —— 包含了这位员工的所有详细信息,他的名字叫 John Smith ,今年 25 岁,喜欢攀岩。
PUT /megacorp/employee/2
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like t

最低0.47元/天 解锁文章

2481

被折叠的 条评论
为什么被折叠?



