MST
星途 面试题库

面试题:ElasticSearch索引别名在复杂业务场景下的应用

在一个电商搜索系统中,有多个索引分别存储不同类别的商品数据(如电子产品索引、服装索引等)。随着业务发展,需要实现一种功能:当进行全站搜索时,通过一个别名可以检索所有商品类别的索引数据;当进行类别特定搜索时,能通过另外的别名精准定位到对应类别的索引。请详细说明如何设计和实现这些索引别名以及相关的映射和配置,同时阐述在索引数据更新、删除等操作时,如何保证别名的正常使用。
39.0万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

1. 索引别名设计与实现

  1. 全站搜索别名
    • 在 Elasticsearch 中(以 Elasticsearch 为例,其他搜索引擎原理类似),可以通过 _aliases API 来创建别名。假设我们有电子产品索引 electronics_index 和服装索引 clothes_index,要创建一个全站搜索别名 all_products_alias,可以使用如下请求:
    POST /_aliases
    {
        "actions": [
            {
                "add": {
                    "index": "electronics_index",
                    "alias": "all_products_alias"
                }
            },
            {
                "add": {
                    "index": "clothes_index",
                    "alias": "all_products_alias"
                }
            }
        ]
    }
    
    • 这样,当使用 all_products_alias 进行搜索时,会同时搜索 electronics_indexclothes_index 中的数据。
  2. 类别特定搜索别名
    • 对于电子产品类别特定搜索别名,比如 electronics_alias,可以这样创建:
    POST /_aliases
    {
        "actions": [
            {
                "add": {
                    "index": "electronics_index",
                    "alias": "electronics_alias"
                }
            }
        ]
    }
    
    • 同理,对于服装类别特定搜索别名 clothes_alias
    POST /_aliases
    {
        "actions": [
            {
                "add": {
                    "index": "clothes_index",
                    "alias": "clothes_alias"
                }
            }
        ]
    }
    
    • 这样,使用 electronics_alias 搜索就只会搜索 electronics_index 中的数据,clothes_alias 只会搜索 clothes_index 中的数据。

2. 映射和配置

  1. 索引映射
    • 不同类别的索引有不同的映射结构。例如,电子产品索引可能有 brand(品牌)、model(型号)、price(价格)等字段,其映射配置示例如下:
    PUT /electronics_index
    {
        "mappings": {
            "properties": {
                "brand": {
                    "type": "text"
                },
                "model": {
                    "type": "text"
                },
                "price": {
                    "type": "float"
                }
            }
        }
    }
    
    • 服装索引可能有 size(尺码)、color(颜色)、style(款式)等字段,映射配置示例如下:
    PUT /clothes_index
    {
        "mappings": {
            "properties": {
                "size": {
                    "type": "text"
                },
                "color": {
                    "type": "text"
                },
                "style": {
                    "type": "text"
                }
            }
        }
    }
    
  2. 别名配置
    • 别名本身没有额外的配置,主要是通过 _aliases API 进行管理。在配置文件层面(如 Elasticsearch 的 elasticsearch.yml),没有专门针对别名的配置项,但要确保集群正常运行,网络配置、节点配置等相关参数要正确设置。

3. 索引数据更新、删除等操作时保证别名正常使用

  1. 数据更新
    • 当对某个索引中的数据进行更新时,别名不受影响。例如,使用 UPDATE API 更新 electronics_index 中的一条记录:
    POST /electronics_index/_update/{document_id}
    {
        "doc": {
            "price": 100.5
        }
    }
    
    • 由于别名是指向索引的逻辑指针,索引内部数据更新不会改变别名与索引的关联关系,所以通过 all_products_aliaselectronics_alias 搜索时,能获取到更新后的数据。
  2. 数据删除
    • 当删除某个索引中的数据时,同样,别名不受影响。比如删除 clothes_index 中的一条记录:
    DELETE /clothes_index/_doc/{document_id}
    
    • 别名仍然能正常使用,只是搜索结果中不再包含已删除的文档。
  3. 索引删除
    • 如果要删除某个索引,比如 electronics_index,直接删除会导致 electronics_aliasall_products_alias 指向异常。为避免这种情况,应该先从别名中移除该索引,再删除索引。例如:
    POST /_aliases
    {
        "actions": [
            {
                "remove": {
                    "index": "electronics_index",
                    "alias": "all_products_alias"
                }
            },
            {
                "remove": {
                    "index": "electronics_index",
                    "alias": "electronics_alias"
                }
            }
        ]
    }
    
    • 然后再删除索引:
    DELETE /electronics_index
    
    • 这样,其他别名仍然能正常使用,不会出现指向错误的情况。
  4. 索引新增
    • 当新增一个索引,比如新增家居用品索引 homeware_index,要使其能被 all_products_alias 搜索到,需要将其添加到该别名:
    POST /_aliases
    {
        "actions": [
            {
                "add": {
                    "index": "homeware_index",
                    "alias": "all_products_alias"
                }
            }
        ]
    }
    
    • 同时,如果需要为家居用品索引创建类别特定别名 homeware_alias,也可以按之前的方式创建:
    POST /_aliases
    {
        "actions": [
            {
                "add": {
                    "index": "homeware_index",
                    "alias": "homeware_alias"
                }
            }
        ]
    }
    

通过以上设计、实现和维护策略,可以有效地管理电商搜索系统中的索引别名,确保在各种数据操作下,搜索功能的正常运行。