面试题答案
一键面试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_index
和clothes_index
中的数据。
- 在 Elasticsearch 中(以 Elasticsearch 为例,其他搜索引擎原理类似),可以通过
- 类别特定搜索别名
- 对于电子产品类别特定搜索别名,比如
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. 映射和配置
- 索引映射
- 不同类别的索引有不同的映射结构。例如,电子产品索引可能有
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" } } } }
- 不同类别的索引有不同的映射结构。例如,电子产品索引可能有
- 别名配置
- 别名本身没有额外的配置,主要是通过
_aliases
API 进行管理。在配置文件层面(如 Elasticsearch 的elasticsearch.yml
),没有专门针对别名的配置项,但要确保集群正常运行,网络配置、节点配置等相关参数要正确设置。
- 别名本身没有额外的配置,主要是通过
3. 索引数据更新、删除等操作时保证别名正常使用
- 数据更新
- 当对某个索引中的数据进行更新时,别名不受影响。例如,使用
UPDATE
API 更新electronics_index
中的一条记录:
POST /electronics_index/_update/{document_id} { "doc": { "price": 100.5 } }
- 由于别名是指向索引的逻辑指针,索引内部数据更新不会改变别名与索引的关联关系,所以通过
all_products_alias
或electronics_alias
搜索时,能获取到更新后的数据。
- 当对某个索引中的数据进行更新时,别名不受影响。例如,使用
- 数据删除
- 当删除某个索引中的数据时,同样,别名不受影响。比如删除
clothes_index
中的一条记录:
DELETE /clothes_index/_doc/{document_id}
- 别名仍然能正常使用,只是搜索结果中不再包含已删除的文档。
- 当删除某个索引中的数据时,同样,别名不受影响。比如删除
- 索引删除
- 如果要删除某个索引,比如
electronics_index
,直接删除会导致electronics_alias
和all_products_alias
指向异常。为避免这种情况,应该先从别名中移除该索引,再删除索引。例如:
POST /_aliases { "actions": [ { "remove": { "index": "electronics_index", "alias": "all_products_alias" } }, { "remove": { "index": "electronics_index", "alias": "electronics_alias" } } ] }
- 然后再删除索引:
DELETE /electronics_index
- 这样,其他别名仍然能正常使用,不会出现指向错误的情况。
- 如果要删除某个索引,比如
- 索引新增
- 当新增一个索引,比如新增家居用品索引
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" } } ] }
- 当新增一个索引,比如新增家居用品索引
通过以上设计、实现和维护策略,可以有效地管理电商搜索系统中的索引别名,确保在各种数据操作下,搜索功能的正常运行。