提升搜索引擎效率:使用 Elasticsearch 别名

news2024/10/5 21:23:16


​Elasticsearch 因其强大的搜索能力而备受推崇,使其成为构建高性能搜索引擎的热门选择。其中一个关键特性是使用别名,Elasticsearch 的别名为优化搜索操作、提升查询性能以及启用动态索引管理提供了强大的机制。在本文中,我们将探讨如何使用别名在 Elasticsearch 中创建一个高效的搜索引擎,并通过架构图和示例展示其实际用途。

什么是别名? 在 Elasticsearch 中,别名是与一个或多个索引关联的次要名称或标签。它们充当指向实际索引的指针或引用,允许您使用多个名称与索引交互。别名抽象了底层的索引名称,为应用程序和索引之间提供了灵活性和解耦。

在 Elasticsearch 中使用别名的好处 Elasticsearch 中的别名提供了一系列增强索引管理、部署策略、搜索效率和数据组织的优点。让我们更详细地探讨使用别名的优势:

  1. 索引抽象: 别名允许使用用户定义的名称来抽象底层的索引名称。这种抽象屏蔽了应用程序对索引名称变化的影响,使得在不修改应用程序代码的情况下更容易切换或更新索引。通过使用别名,应用程序可以使用一致的、有意义的名称来引用索引,即使底层索引发生变化,这些名称也保持不变。
  2. 索引管理: 别名简化了索引管理任务。当创建一个新索引或替换一个现有索引时,可以更新别名指向新的索引。这种方法使得无缝切换成为可能,并减少了对应用程序配置的影响。只需要修改别名,而不需要在应用程序代码中更新新的索引名称,使索引更新更易于管理,更不容易出错。
  3. 蓝绿部署: 别名在蓝绿部署策略中特别有用。在这种策略中,会维护两套索引:"蓝色"套表示当前的生产版本,而 "绿色"套表示正在部署的新版本。通过为索引的不同版本分配别名,可以通过更新别名,无缝切换流量从旧版本到新版本。这个过程确保在部署过程中零停机时间,并在必要时可以轻松回滚。
  4. 索引滚动: Elasticsearch的索引滚动特性允许根据定义的标准,如大小或时间,自动创建新索引。可以使用别名来一致性地引用最新的活动索引,简化查询,并消除在应用程序中更新索引名称的需要。有了别名,可以查询别名,而不是引用特定的索引名称,确保应用程序总是与最新的数据一起工作,无需手动干预。
  5. 数据分区: 别名使得基于特定标准在多个索引之间进行有效的数据分区成为可能,通过将别名与具有共同特征的索引子集关联起来,如时间范围或类别,可以缩小搜索空间并提高搜索性能。例如,可以创建只包含特定时间范围内的文档的别名,使得可以更高效地在该分区内搜索或聚合数据。
  6. 过滤和路由: 别名可以与过滤器或路由值关联,为搜索操作提供额外的灵活性。通过在别名中定义过滤器,可以对符合特定条件的文档子集执行搜索或聚合。这使得能够将搜索操作集中在相关的数据子集上,提高搜索效率,减少不必要的数据处理。同样,与别名关联的路由值允许根据预定义的规则将搜索查询直接引向特定的索引,进一步优化搜索性能。

场景

为了更好地理解别名的实际使用,让我们考虑一个实际例子:一个处理产品数据并使用搜索微服务进行产品信息搜索的电商平台。该平台维护一个名为 “index1” 的索引来存储产品信息,如图1所示。现在,假设我们想引入版本控制,这涉及到索引新的产品信息,使其可供客户搜索。目标是无缝地过渡到新版本,而不对应用程序产生任何中断。

*图 1:在索引之间切换别名*

步骤1:初始索引设置

电商平台从一个名为 “index1” 的索引开始,它保存着现有的产品数据。

步骤2:创建别名

为了确保平滑的过渡,平台创建了一个名为 “readAlias” 的别名,并将其与 “index1” 索引关联。这个别名作为应用程序的主要参考点,抽象了底层的索引名。

步骤3:引入新的索引版本

为了适应更新和修改,创建了一个新版本的索引 “index2”。这个新版本将存储更新的产品信息。而搜索应用程序,在运行时通过 readAlias 从 Index1 读取数据。

步骤4:更新别名

为了无缝切换到新的索引版本,平台更新了别名 “readAlias”,使其指向 “index2” 索引。这种变化确保了应用程序可以与新索引互动,而不需要对现有的代码库进行任何修改。

步骤5:删除旧的索引

一旦成功更新了别名,平台就可以安全地删除旧的索引 “index1”,因为它不再被积极使用。

通过更新别名,应用程序可以无缝地与新索引互动,无需进行任何代码修改。此外,它还可以通过别名使用过滤或路由技术,在基于类别、可用性或其他标准的产品子集上执行特定操作。

使用 Elasticsearch Rest API 在 Elasticsearch 中创建别名

PUT /_aliases
​
{
​
  "actions": [
​
    {
​
      "add": {
​
        "index": "index1",
​
        "alias": "readAlias"
​
      }
​
    }
​
  ]
​
}

更新别名并删除旧的索引

为了将别名切换到新的索引版本并删除旧的索引,我们可以在单个 _aliases 操作中执行多个动作。以下命令从 “readAlias” 别名中移除 “index1” 并添加 “index2”:

POST _aliases
​
{
​
  "actions": [
​
    {
​
      "remove": {
​
        "index": "index1",
​
        "alias": "readAlias"
​
      }
​
    },
​
    {
​
      "add": {
​
        "index": "index2",
​
        "alias": " readAlias"
​
      }
​
    }
​
  ]
​
}

使用这些操作,别名 “readAlias” 现在指向 “index2” 版本,有效地转换到新的产品数据。

在Spring Boot应用程序中使用Elasticsearch别名

要在Spring Boot应用程序中使用Elasticsearch别名,首先,配置Elasticsearch连接属性。然后,创建一个Elasticsearch实体类,并用映射注解进行注解。接下来,定义一个扩展了适当的Spring Data Elasticsearch接口的仓库接口。使用ElasticsearchOperations bean 和 AliasActions编程创建别名。最后,通过调用仓库接口的方法,使用别名执行搜索和CRUD操作。通过这些步骤,您可以在您的Spring Boot应用程序中无缝地使用Elasticsearch别名,提高索引管理和搜索功能。

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
    
    @Autowired
    private ElasticsearchOperations elasticsearchOperations;
​
    @PostConstruct
    public void createAliases() {
        String indexV1 = "index1";
        String indexV2 = "index2";
        
        IndexCoordinates indexCoordinatesV1 = IndexCoordinates.of(indexV1);
        IndexCoordinates indexCoordinatesV2 = IndexCoordinates.of(indexV2);
        
        AliasActions aliasActions = new AliasActions();
        
        // Creating an alias for indexV1
        aliasActions.add(
            AliasAction.add()
                .alias("readAlias")
                .index(indexCoordinatesV1.getIndexName())
        );
        
        // Creating an alias for indexV2
        aliasActions.add(
            AliasAction.add()
                .alias("readAlias")
                .index(indexCoordinatesV2.getIndexName())
        );
        
        // Applying the alias actions
        elasticsearchOperations.indexOps(Product.class).aliases(aliasActions);
    }
}

在这个例子中,createAliases() 方法用 @PostConstruct 注解,确保在应用程序启动时创建别名。它使用 AliasActions 类来定义别名操作,包括为 “index1” 和 “index2” 索引都添加 “readAlias” 别名。

@Service
public class ProductService {
​
    @Autowired
    private ProductRepository productRepository;
​
    public List<Product> searchProducts(String query) {
        return productRepository.findByName(query);
    }
​
    // Other service methods for CRUD operations
}
​

在 ProductService 类中,我们可以调用 ProductRepository 中的方法来根据 “readAlias” 别名执行搜索操作。Spring Data Elasticsearch 仓库将根据别名配置将查询路由到适当的索引。

结论

Elasticsearch 别名为索引管理提供了宝贵的工具,使电商平台能够实现无缝过渡、版本管理和高效数据检索。通过使用别名,电商企业可以确保服务不间断,利用搜索微服务,并提高他们的整体数据管理能力。采用别名使组织能够在保持稳定和高性能的应用环境的同时,发展他们的产品索引。

作者:Tapan Kumar Behera

更多技术干货请关注公号“云原生数据库

squids.cn,目前可体验全网zui低价RDS,免费的迁移工具DBMotion、SQL开发工具等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择最适合企业的自动化测试工具?

在软件开发过程中&#xff0c;测试是不可或缺的环节。而自动化测试工具则能够提高测试效率&#xff0c;减少人力成本&#xff0c;为企业带来更好的收益。但如何选择最适合企业的自动化测试工具呢&#xff1f;下面就为大家介绍一些选择自动化测试工具的方法和要点。 1.明确测试…

新版危废标签解读及制作教程分享

《HJ 1276-2022危险废物识别标志设置技术规范》&#xff08;以下简称为《规范》&#xff09;将于7月1日起正式实施。新的《规范》具体规定了产生、收集、贮存、利用、处置危险废物单位需设置的危险废物识别标志的分类、内容要求、设置要求和制作方法。 为方便企业更好地了解《…

AGRCZO-A-10/315先导比例减压阀放大器

AGRCZO-A-10/50、AGRCZO-A-10/100、AGRCZO-A-10/210/I、AGRCZO-A-10/315、AGRCZO-A-20/50、AGRCZO-A-20/100/U0/PE、AGRCZO-A-20/210、AGRCZO-A-20/315先导式比例减压阀 在比例溢流导阀2与主阀座0中间配有压力过载保护的手调溢流阀3。此阀流量范围比较大&#xff0c;一般用在系…

基于SpringBoot+vue的旅游管理系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

大数据面试题:Zookeeper架构

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 可回答&#xff1a; 1&#xff09;说一说Zookeeper中的角色 问过的一些公司&#xff1a;京东提前批(2020.07)&#xff0c;蘑菇街实习(2020.03) 参…

ML@集成学习中结合策略

文章目录 集成学习中结合策略结合策略平均法简单平均法加权平均法 投票法绝对多数投票法MV相对多数投票法PV加权投票法WV小结其他投票法技巧 学习法Stacking伪代码次级训练集的生成&#x1f388; refs更多集成学习相关参考 Skearn中的集成学习引言摘要翻译1翻译2 集成学习中结合…

界面开发框架Qt新手入门教程:如何使用Calendar组件创建日历(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文中的CalendarWi…

基于区块链技术的旅游积分通兑系统设计

基于区块链技术的旅游积分通兑系统设计 贵向泉1,2, 郭志礼1, 杨裔2,3&#xff0c;秦炳峰4 1 兰州理工大学计算机与通信学院&#xff0c;甘肃 兰州 730050 2 兰州大学旅游信息融合处理与数据权属保护文化和旅游部重点实验室&#xff0c;甘肃 兰州 730000 3 兰州大学信息科学与工…

Linux驱动学习(4) MTD字符驱动和块驱动3

系列文章目录 Linux驱动学习&#xff08;4&#xff09; MTD字符驱动和块驱动1 Linux驱动学习&#xff08;4&#xff09; MTD字符驱动和块驱动2 Linux驱动学习&#xff08;4&#xff09; MTD字符驱动和块驱动3 文章目录 目录 系列文章目录 文章目录 前言 二、MTD块设备驱…

NXP i.MX 6ULL工业核心板硬件说明书( ARM Cortex-A7,主频792MHz)

1 硬件资源 创龙科技SOM-TLIMX6U是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的低成本工业级核心板&#xff0c;主频792MHz&#xff0c;通过邮票孔连接方式引出Ethernet、UART、CAN、LCD、USB等接口。核心板经过专业的PCB Layout和高低温测试验证&…

一篇文章带你从入门都入土 RocketMQ 消息中间件

目录 一、下载、安装 二、基本演示 2.1 创建项目导入依赖 2.2 生产者发送消息 2.3 消费者消费消息 三、topic 、broker、messageQueue之间的关系 四、普通消息 4.1 普通消息生命周期 4.2 可靠同步发送 4.3 可靠异步发送 4.4 单向发送 五、顺序消息 5.1 如何保证消…

机器学习之朴素贝叶斯(Naive Bayes)

1 朴素贝叶斯算法介绍 朴素贝叶斯是经典的机器学习算法之一&#xff0c;也是为数不多的基于概率论的分类算法。朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论&#xff0c;有着坚实的数学基础&#xff0c;以及稳定的分类效率&#xff0c;是应用最为广泛的…

python发送邮件,超简单!

1、我的使用场景 最近有几个爬虫定时任务在运行&#xff0c;需要及时知道发生异常&#xff0c;以便于处理&#xff0c;于是&#xff0c;想到了邮件&#xff0c;记录一下。 2、邮箱服务设置 我是专门为这个脚本注册的&#xff0c;如果有&#xff0c;也可以不注册。 注册完&a…

Transformer(四)--实现验证:transformer 机器翻译实践

转载请注明出处&#xff1a;https://blog.csdn.net/nocml/article/details/125711025 本系列传送门&#xff1a; Transformer(一)–论文翻译&#xff1a;Attention Is All You Need 中文版 Transformer(二)–论文理解&#xff1a;transformer 结构详解 Transformer(三)–论文实…

sql server 触发器往链接服务器同步数据的坑

链接服务器无法启动分布式服务 检查数据库是否勾选了一下按钮&#xff0c;双方都要检查 链接服务器属性&#xff0c;需要检查这些地方是否已经设置为true 该伙伴事务管理器已经禁止了它对远程/网络事务的支持 双方启动MSDTC服务 (1)在windows控制面版–>windows 工具->…

Sourcetree: The host key is not cached for this server:

使用Sourcetree 出现提示&#xff1a;The host key is not cached for this server: 工具>选项>一般 确认完成&#xff0c;解决问题。

【嵌入式Qt开发入门】使用 UI 设计器开发程序

本文我们继续学习如何使用 Qt Designer 开发程序&#xff0c;Qt Designer 是属于 Qt Creator 的一个功能而已&#xff0c;大家不要搞混了。Qt Designer 也叫 UI 设计师或者 UI 设计器&#xff0c;这都是指的同一 个东西。下面简单介绍如何使用 UI 设计器开发程序&#xff0c;以…

webassembly如何在js侧使用注册的容器类型

需求&#xff1a;是有个C接口&#xff0c;参数是vector<string>类型&#xff0c;那么如何在js端调用这个接口呢&#xff1f; #include <emscripten/emscripten.h> #include <emscripten/bind.h> #include <vector> #include <string> #include …

Modbus Slave和Modbus Poll的使用说明

文章目录 1 软件说明2 本例目标3 Modbus Poll配置步骤4 Modbus Slave配置步骤5 各种测试5.1 正常显示5.2 Slave Id不一致5.3 Quantity不够5.4 测试IP Address 6 总结 1 软件说明 Modbus Poll&#xff1a;是Witte Software公司开发的的Modbus主机仿真器&#xff0c;用于测试和调…

2022年影响因子新鲜出炉!(附↓)

【SciencePub学术】6月28日,科睿唯安发布2023年度《期刊引证报告》&#xff08;Journal Citation Reports&#xff0c;简称 JCR&#xff09;。 本年度《引证报告》对Web of Science核心合集收录的所有期刊赋予期刊影响因子&#xff0c;同时&#xff0c;为鼓励用户在比较期刊时…