当前位置: 首页 > article >正文

Elasticsearch 高级技巧

 

 

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.kler.cn/a/536563.html

相关文章:

  • idea 找不到或者无法加载主类
  • 【Linux网络编程】之守护进程
  • Baklib赋能数字内容体验个性化推荐提升用户体验的未来之路
  • 【GitLab CI/CD 实践】从 0 到 1 搭建高效自动化部署流程
  • source 与 shell 之详解(Detailed Explanation of Source and Shell)
  • innoDB 如何解决幻读
  • 基于机器学习时序库pmdarima实现时序预测
  • 使用 `WITH` 子句优化复杂 SQL 查询
  • 6 maven工具的使用、maven项目中使用日志
  • RISC-V芯片与扩展医疗影像处理边缘设备编程探析
  • SQL Server 数据库迁移到 MySQL 的完整指南
  • BCrypt加密密码和md5加密哪个更好一点///jwt和rsa有什么区别//为什么spring中经常要用个r类
  • 优惠券平台(十一):布隆过滤器、缓存空值、分布式组合的双重判定锁解决缓存穿透问题
  • 区块链技术:Facebook 重塑社交媒体信任的新篇章
  • Copilot量化指标参数及其方法
  • 37构造回文字符串问题-青训营刷题
  • 蓝桥杯小白打卡第四天
  • [Day 16]螺旋遍历二维数组
  • 解决react中函数式组件usestate异步更新
  • AI驱动的智能流程自动化是什么
  • python绘图(1)
  • 持仓与感悟记录
  • ComfyUI 安装教程:macOS 和 Linux 统一步骤
  • 《解锁GANs黑科技:打造影视游戏的逼真3D模型》
  • idea通过codeGPT插件集成DeepSeek
  • Ollama python交互:chat+embedding实践