Elasticsearch 高级特性 Elasticsearch 高级特性详解与实践 1. 跨集群复制 (CCR) CCR 允许你在不同的 Elasticsearch 集群之间复制索引数据。这对于灾难恢复、数据本地化和读写分离等场景非常有用。 概念: Leader 集群: 数据的原始来源。 Follower 集群: 复制 Leader 集群数据的集群。 Follower 索引: 在 Follower 集群中创建的只读索引,自动从 Leader 索引同步数据。 实践: 配置 Leader 集群: 在 中设置 。 配置用户权限,允许 Follower 集群访问 Leader 集群。 配置 Follower 集群: 在 中设置 。
1. 跨集群复制 (CCR)
CCR 允许你在不同的 Elasticsearch 集群之间复制索引数据。这对于灾难恢复、数据本地化和读写分离等场景非常有用。
概念:
Leader 集群: 数据的原始来源。
Follower 集群: 复制 Leader 集群数据的集群。
Follower 索引: 在 Follower 集群中创建的只读索引,自动从 Leader 索引同步数据。
实践:
配置 Leader 集群:
在 elasticsearch.yml 中设置 cluster.remote.connect: true。
配置用户权限,允许 Follower 集群访问 Leader 集群。
配置 Follower 集群:
在 elasticsearch.yml 中设置 cluster.remote.connect: true。
添加 Leader 集群的连接信息:
cluster: remote: leader_cluster: seeds: ["leader_node_1:9300", "leader_node_2:9300"]
创建 Follower 索引:
PUT /my_follower_index/_ccr/follow { "remote_cluster": "leader_cluster", "leader_index": "my_leader_index" }
停止 Follower 索引:
POST /my_follower_index/_ccr/unfollow
图示:
2. 冻结层 (Frozen Tier)
冻结层允许你将不经常访问的索引数据存储在成本较低的硬件上,同时保持可搜索性。这对于需要长期存储大量数据的场景非常有用。
概念:
Warm Tier: 存储相对活跃的数据,使用较快的存储设备。
Cold Tier: 存储不经常访问的数据,使用成本较低的存储设备。
Frozen Tier: 存储极少访问的数据,使用更低成本的存储设备,例如对象存储。
实践:
配置索引生命周期策略 (ILM):
PUT _ilm/policy/my_policy { "policy": { "phases": { "warm": { "min_age": "30d", "actions": { "allocate": { "require": { "data": "warm" } } } }, "cold": { "min_age": "90d", "actions": { "allocate": { "require": { "data": "cold" } } } }, "frozen": { "min_age": "365d", "actions": { "freeze": {}, "allocate": { "require": { "data": "frozen" } } } } } } }
应用 ILM 策略到索引:
PUT /my_index { "settings": { "index.lifecycle.name": "my_policy" } }
node.attr.data) 来区分 Warm、Cold 和 Frozen 节点。图示:
3. 向量搜索 (Vector Search)
Elasticsearch 增强了向量搜索能力,支持存储和查询向量数据,这对于相似性搜索、推荐系统和图像识别等应用非常有用。
概念:
向量: 将文档、图像或其他数据表示为高维空间中的点。
相似度度量: 用于计算向量之间相似度的算法,例如余弦相似度。
近似最近邻 (ANN) 搜索: 用于在大量向量数据中快速查找相似向量的算法。
实践:
创建包含向量字段的索引:
PUT /my_vector_index { "mappings": { "properties": { "my_vector": { "type": "dense_vector", "dims": 128 } } } }
索引包含向量数据的文档:
POST /my_vector_index/_doc { "my_vector": [0.1, 0.2, ..., 0.9] }
执行向量搜索:
GET /my_vector_index/_search { "query": { "script_score": { "query": { "match_all": {} }, "script": { "source": "cosineSimilarity(params.query_vector, 'my_vector') + 1.0", "params": { "query_vector": [0.2, 0.3, ..., 0.8] } } } } }
GET /my_vector_index/_search { "knn": { "field": "my_vector", "query_vector": [0.2, 0.3, ..., 0.8], "k": 10, "num_candidates": 100 } }
图示:
4. 脚本评分 (Script Scoring)
脚本评分允许你使用自定义脚本来计算文档的相关性得分,从而实现更灵活的搜索排序。
概念:
脚本: 使用 Painless 脚本语言编写的自定义逻辑。
评分函数: 用于计算文档得分的函数,可以访问文档字段、查询参数和 Elasticsearch 内置函数。
实践:
GET /my_index/_search { "query": { "script_score": { "query": { "match": { "my_field": "search term" } }, "script": { "source": "Math.log(_score + 1) + doc['my_numeric_field'].value" } } } }
说明:
_score 表示原始的 BM25 评分。
doc['my_numeric_field'].value 访问文档中的数值字段。
Math.log 是 Painless 内置的数学函数。
图示:
5. 索引生命周期管理 (ILM)
ILM 允许你自动化索引的生命周期管理,包括创建、滚动、优化、冻结和删除索引。
概念:
策略: 定义索引生命周期的各个阶段和操作。
阶段: 索引生命周期的不同阶段,例如 Hot、Warm、Cold 和 Delete。
操作: 在每个阶段执行的操作,例如滚动、优化、冻结和删除。
实践:
定义 ILM 策略 (如上面冻结层例子所示)。
应用 ILM 策略到索引 (如上面冻结层例子所示)。
图示:
6. 异步搜索 (Asynchronous Search)
异步搜索允许你提交长时间运行的搜索请求,并在稍后检索结果。这对于需要处理大量数据或执行复杂查询的场景非常有用。
概念:
提交: 将搜索请求提交到 Elasticsearch。
跟踪: 跟踪搜索请求的进度和状态。
检索: 在搜索完成后检索结果。
实践:
提交异步搜索请求:
POST /my_index/_async_search { "size": 1000, "query": { "match_all": {} } }
获取异步搜索请求状态:
GET /_async_search/{search_id}
获取异步搜索结果:
GET /_async_search/{search_id}?wait_for_completion_timeout=1m
删除异步搜索请求:
DELETE /_async_search/{search_id}
图示:
总结:
Elasticsearch 提供了许多强大的高级特性,可以帮助你构建更高效、更灵活的搜索和分析解决方案。 跨集群复制、冻结层、向量搜索、脚本评分、索引生命周期管理和异步搜索只是其中的一部分。 通过深入理解和实践这些特性,你可以充分利用 Elasticsearch 的潜力,满足各种复杂的业务需求。