Elasticsearch 高级技巧

news/2025/2/9 12:27:55/

 

 

Elasticsearch 高级技巧

1. 优化查询

使用过滤器(Filter)而不是查询(Query)

Elasticsearch 中的查询分为两种主要类型:查询(Query) 和 过滤器(Filter)。查询会计算文档的相关性分数(_score),而过滤器则不会。因此,使用过滤器可以显著提高查询性能,特别是当你只需要判断文档是否匹配条件而不关心相关性时。

{"query": {"bool": {"must": [{ "match": { "title": "Elasticsearch" } }],"filter": [{ "term": { "status": "published" } },{ "range": { "date": { "gte": "2023-01-01", "lte": "2023-12-31" } } }]}}
}

在这个例子中,match 查询用于全文搜索标题,而 term 和 range 过滤器用于精确匹配状态和日期范围。

利用缓存

Elasticsearch 默认会对过滤器的结果进行缓存,以便后续请求可以直接使用缓存结果,从而减少重复计算。确保频繁使用的过滤器能够充分利用缓存机制。

{"query": {"bool": {"must": [{ "match": { "content": "performance optimization" } }],"filter": [{ "terms": { "tags": ["elasticsearch", "optimization"] } }]}}
}

在这个例子中,terms 过滤器将被缓存,因为它是基于精确匹配的。

使用复合查询(Compound Queries)

复合查询允许你组合多个简单的查询或过滤器,以实现复杂的逻辑。常见的复合查询包括 booldis_maxconstant_score 等。

示例:bool 查询

{"query": {"bool": {"should": [{ "match": { "title": "Elasticsearch" } },{ "match": { "description": "Elasticsearch" } }],"must_not": [{ "match": { "status": "draft" } }],"minimum_should_match": 1}}
}

在这个例子中,bool 查询结合了多个子查询,实现了复杂的搜索逻辑。

2. 数据建模

使用嵌套对象(Nested Objects)

Elasticsearch 支持嵌套对象,这使得你可以在一个文档中存储复杂的数据结构,如数组中的对象。然而,处理嵌套对象时需要小心,因为它们会影响索引和查询性能。

示例:嵌套对象

假设我们有一个博客文章文档,其中包含评论数组:

{"title": "Introduction to Elasticsearch","comments": [{ "author": "Alice", "content": "Great post!", "date": "2023-01-01" },{ "author": "Bob", "content": "Thanks for sharing.", "date": "2023-01-02" }]
}

为了对评论进行查询,我们需要将其定义为嵌套对象:

PUT /blogposts/_mapping
{"properties": {"comments": {"type": "nested"}}
}

然后,我们可以使用 nested 查询来查找特定作者的评论:

{"query": {"nested": {"path": "comments","query": {"bool": {"must": [{ "match": { "comments.author": "Alice" } },{ "match": { "comments.content": "Great" } }]}}}}
}

使用父-child 关系

对于更复杂的关系建模,可以使用父-child 关系。这种方式适用于一个文档与多个子文档之间的一对多关系。

示例:父-child 关系

假设我们有一个论坛,每个帖子(父文档)可以有多个回复(子文档)。首先,我们需要定义父-child 映射:

PUT /forum
{"mappings": {"properties": {"post": {"type": "join","relations": {"post": "reply"}}}}
}

然后,插入父文档和子文档:

POST /forum/_doc/1?refresh
{"title": "Elasticsearch Tips","post": "post"
}POST /forum/_doc/2?routing=1&refresh
{"content": "Great tips!","post": {"name": "reply","parent": "1"}
}

最后,使用 has_child 或 has_parent 查询来关联父子文档:

{"query": {"has_child": {"type": "reply","query": {"match": {"content": "tips"}}}}
}

3. 聚合分析

使用桶聚合(Bucket Aggregations)

桶聚合将文档分组到不同的桶中,类似于 SQL 中的 GROUP BY 操作。常用的桶聚合包括 termsrangedate_histogram 等。

示例:按标签分类

假设我们要统计每篇文章的标签数量:

{"size": 0,"aggs": {"tag_count": {"terms": {"field": "tags.keyword","size": 10}}}
}

使用指标聚合(Metric Aggregations)

指标聚合对桶内的文档进行计算,生成统计信息,如平均值、最大值、最小值等。常用的指标聚合包括 avgsummaxmin 等。

示例:计算平均评分

假设我们要计算每篇文章的平均评分:

{"size": 0,"aggs": {"avg_rating": {"avg": {"field": "rating"}}}
}

使用管道聚合(Pipeline Aggregations)

管道聚合对其他聚合的结果进行进一步的计算或转换。常用的管道聚合包括 bucket_sortderivativecumulative_sum 等。

示例:排序桶

假设我们要根据标签的数量对桶进行排序:

{"size": 0,"aggs": {"tag_count": {"terms": {"field": "tags.keyword","size": 10},"aggs": {"sort_by_count": {"bucket_sort": {"sorts": [{ "_count": "desc" }]}}}}}
}

4. 监控和调优

监控集群健康状况

Elasticsearch 提供了一系列 API 来监控集群的状态和性能。常用的监控接口包括 _cluster/health_cat/nodes_nodes/stats 等。

示例:检查集群健康状况

GET /_cluster/health

响应示例:

{"cluster_name" : "my_cluster","status" : "green","timed_out" : false,"number_of_nodes" : 3,"number_of_data_nodes" : 3,"active_primary_shards" : 5,"active_shards" : 10,"relocating_shards" : 0,"initializing_shards" : 0,"unassigned_shards" : 0,"delayed_unassigned_shards" : 0,"number_of_pending_tasks" : 0,"number_of_in_flight_fetch" : 0,"task_max_waiting_in_queue_millis" : 0,"active_shards_percent_as_number" : 100.0
}

调整分片和副本设置

合理的分片和副本设置对于保证集群的性能和可靠性至关重要。通常,可以根据节点数量和数据量来调整这些设置。

示例:创建索引时指定分片和副本

PUT /my_index
{"settings": {"index": {"number_of_shards": 3,"number_of_replicas": 1}}
}

使用慢查询日志

慢查询日志可以帮助你识别并优化执行时间较长的查询。可以通过配置 slowlog 设置来启用和自定义慢查询日志。

示例:配置慢查询日志

PUT /my_index/_settings
{"index.search.slowlog.threshold.query.warn": "10s","index.search.slowlog.threshold.query.info": "5s","index.search.slowlog.threshold.query.debug": "2s","index.search.slowlog.threshold.query.trace": "500ms","index.search.slowlog.threshold.fetch.warn": "1s","index.search.slowlog.threshold.fetch.info": "800ms","index.search.slowlog.threshold.fetch.debug": "500ms","index.search.slowlog.threshold.fetch.trace": "200ms"
}

5. 安全性和权限管理

启用 X-Pack 安全功能

X-Pack 是 Elasticsearch 的商业插件包,提供了许多高级功能,包括安全性、监控和报告等。通过启用 X-Pack 的安全特性,可以保护你的集群免受未经授权的访问。

示例:启用用户认证

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

创建角色和用户

通过创建角色和用户,可以细粒度地控制对集群资源的访问权限。

示例:创建角色

POST /_security/role/my_role
{"indices": [{"names": [ "logs-*" ],"privileges": [ "read", "write" ]}]
}

示例:创建用户

POST /_security/user/my_user
{"password" : "secure_password","roles" : [ "my_role" ],"full_name" : "John Doe","email" : "john.doe@example.com"
}

6. 备份和恢复

使用快照和还原

Elasticsearch 提供了快照和还原功能,可以定期备份数据并在需要时恢复。通过配置快照仓库和执行快照操作,可以轻松实现这一目标。

示例:配置快照仓库

PUT /_snapshot/my_backup_repo
{"type": "fs","settings": {"location": "/path/to/snapshot/directory"}
}

示例:创建快照

PUT /_snapshot/my_backup_repo/snapshot_1?wait_for_completion=true

示例:还原快照

POST /_snapshot/my_backup_repo/snapshot_1/_restore
{"indices": "index_1,index_2","ignore_unavailable": true,"include_global_state": false,"rename_pattern": "index_(.+)","rename_replacement": "restored_index_$1"
}

7. 使用 Kibana 进行可视化

Kibana 是 Elasticsearch 的官方可视化工具,可以帮助你构建丰富的仪表盘和可视化报表。通过 Kibana,你可以直观地展示数据趋势和洞察,提升数据分析的效率。

示例:创建仪表盘

  1. 1. 打开 Kibana 并导航到“Discover”页面。
  2. 2. 添加所需的索引模式。
  3. 3. 在“Visualize”页面创建各种图表,如柱状图、折线图等。
  4. 4. 将这些图表添加到新的仪表板中,并保存。

结语

好了,今天的分享就到这里啦!希望通过这篇文章,大家能够掌握一些高级的 Elasticsearch 技巧,更好地利用其强大的功能来解决实际问题。如果你还有其他疑问或者想要了解更多相关信息,欢迎在评论区留言交流哦~

最后,我想引用一句名言:“真正的高手,往往不在意江湖地位高低;真正的技术,也不在乎形式包装如何华丽。”我相信,只有真正理解并掌握 Elasticsearch 的核心技术,才能让它真正成为我们手中的利剑,助力我们在数据的世界里披荆斩棘!


希望你喜欢这篇文章!如果有任何建议或反馈,请随时告诉我。我们一起加油,向着更好的自己迈进!

 

 


http://www.ppmy.cn/news/1570575.html

相关文章

【深度学习入门_机器学习理论】决策树(Decision Tree)

本部分主要为机器学习理论入门_决策树算法,书籍参考 “ 统计学习方法(第二版)”。 学习目标: 熟悉决策树基础知识:树、熵、信息增益、基尼指数;熟悉决策树构建步骤;熟悉3种典型决策树算法&…

数据中台是什么?:架构演进、业务整合、方向演进

文章目录 1. 引言2. 数据中台的概念与沿革2.1 概念定义2.2 历史沿革 3. 数据中台的架构组成与关键技术要素解析3.1 架构组成3.2 关键技术要素 4. 数据中台与其他平台的对比详细解析 5. 综合案例:金融行业数据中台落地实践5.1 背景5.2 解决方案5.3 成果与价值 6. 方向…

Nginx 配置 SSL(HTTPS)详解

Nginx作为一款高性能的HTTP和反向代理服务器,自然支持SSL/TLS加密通信。本文将详细介绍如何在Nginx中配置SSL,实现HTTPS的访问。 随着互联网安全性的日益重要,HTTPS协议逐渐成为网站加密通信的标配。Nginx作为一款高性能的HTTP和反向代理服务…

【单层神经网络】基于MXNet库简化实现线性回归

写在前面 同最开始的两篇文章 完整程序及注释 导入使用的库# 基本 from mxnet import autograd, nd, gluon # 模型、网络 from mxnet.gluon import nn from mxnet import init # 学习 from mxnet.gluon import loss as gloss # 数据集 from mxnet.gluon…

服务器重启后报Predis_ServerException: Client sent AUTH, but no password is set

Redis问题产生后,处理办法 2025/02/08 11:21:43 [error] [exception.Predis_ServerException] Predis_ServerException: Client sent AUTH, but no password is set in /www/wwwroot/er/protected/extensions/redis/Predis.php:573 Stack trace: #0 /www/wwwroot/er/protected…

Vue3 ref属性

ref() 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value。 function ref<T>(value: T): Ref<UnwrapRef<T>>interface Ref<T> {value: T } 详细信息 ref 对象是可更改的&#xff…

修剪二叉搜索树(力扣669)

这道题还是比较复杂&#xff0c;在递归上与之前写过的二叉树的题目都有所不同。如果当前递归到的子树的父节点不在范围中&#xff0c;我们根据节点数值的大小选择进行左递归还是右递归。为什么找到了不满足要求的节点之后&#xff0c;还要进行递归呢&#xff1f;因为该不满足要…

DeepSeek使用技巧大全(含本地部署教程)

在人工智能技术日新月异的今天&#xff0c;DeepSeek 作为一款极具创新性和实用性的 AI&#xff0c;在众多同类产品中崭露头角&#xff0c;凭借其卓越的性能和丰富的功能&#xff0c;吸引了大量用户的关注。 DeepSeek 是一款由国内顶尖团队研发的人工智能&#xff0c;它基于先进…