第十一章 广告检索系统——加载全量索引(二)

此博客用于个人学习,来源于网上,对知识点进行一个整理。

1. 索引操作:

我们之前实现了将数据库中的索引信息导入到文件中, 目的是在检索的过程中实现数据的加载,构造全量索引。 但是由于写入文件的数据格式和索引的数据格式不一样,于是我们要定义好索引的操作。但由于我们之前定义了索引的增删改查方法,于是我们只需要直接调用就可以实现从文件中获取信息构造全量索引。

1.1 索引操作 handler 的定义与说明:

定义一个枚举,对应索引的操作类型。

public enum OpType {
   
   

    ADD,
    UPDATE,
    DELETE,
    OTHER;
}

由于我们定义的索引方法都需要一个 key-value 的键值对的形式,于是我们在这个操作类中也需要这样子定义。

/**
 * 1. 索引之间存在着层级的划分,也就是依赖关系的划分
 * 2. 加载全量索引其实是增量索引 “增加” 的一种特殊实现
 */
@Slf4j
public class AdLevelDataHandler {
   
   

     private static <K,V> void handleBinlogEvent(IndexAware<K,V> index, K key, V value, OpType type){
   
   
         switch (type){
   
   
             case ADD:
                 index.add(key, value);
                 break;
             case UPDATE:
                 index.update(key, value);
                 break;
             case DELETE:
                 index.delete(key, value);
                 break;
             default:
                 break;
         }
     }
}

1.2 定义第二层级的索引操作:

由于广告计划和广告创意并没有依赖于其他索引,于是将其定义为第二层级的索引,先构建这两个索引对应的方法。逻辑为:通过索引表数据构建索引对象,调用之前定义的索引操作。

public static void handleLevel2(AdPlanTable planTable,OpType type){
   
   
     AdPlanObject planObject = new AdPlanObject(
             planTable.getUserId(),
             planTable.getUserId(),
             planTable.getPlanStatus(),
             planTable.getStartDate(),
             planTable.getEndDate()
     );
     handleBinlogEvent(
             DataTable.of(AdPlanIndex.class),
             planObject.getPlanId(),
             planObject,
             type
     );
 }

public static void handleLevel2(CreativeTable creativeTable, OpType type){
   
   
    CreativeObject creativeObject = new CreativeObject(
            creativeTable.getAdId(),
            creativeTable.getName(),
            creativeTable.getType(),
            creativeTable.getMaterialType(),
            creativeTable.getHeight(),
            creativeTable.getWidth(),
            creativeTable.getAuditStatus(),
            creativeTable.getAdUrl()
    );
    handleBinlogEvent(
            DataTable.of(CreativeIndex.class),
            creativeObject.getAdId(),
            creativeObject,
            type
    );
}

1.3 定义第三层级的索引操作:

由于广告单元关联于广告计划,广告单元创意中间表关联于广告创意,所以将其归类为第三层级。相比于第二层级的对象,不仅需要判断本身对应的索引对象是否为空,还得判断关联的索引对象是否为空。

public static void handleLevel3(AdUnitTable 
### 全量索引的概念 全量索引是对数据集合中的全部数据进行索引构建的过程。它会将数据集中的每一条记录都纳入索引范围,以确保能够对整个数据集进行高效的查询和检索。与增量索引(只对新增或修改的数据构建索引)不同,全量索引是一次性对所有数据创建索引结构。 ### 全量索引的原理 全量索引的构建依赖于特定的数据结构和算法,不同的数据库系统会采用不同的索引结构。例如,在 MySQL 中,常用的是 B+ 树索引结构。B+ 树是一种平衡的多路搜索树,它将数据按照键值的大小进行排序,并且所有的数据都存储在叶子节点上,非叶子节点只存储索引信息,这样可以提高数据的查找效率,尤其适用于范围查询和顺序读取 [^4]。 在 Elasticsearch/Lucene 中,采用的是倒排索引。倒排索引是一种将文档中的每个词项映射到包含该词项的文档列表的数据结构。通过倒排索引,可以快速定位包含特定关键词的文档,大大提高了文本搜索的效率 [^4]。 ### 全量索引的应用场景 1. **数据初始化**:当新创建一个数据库或索引时,需要对已有的全部数据进行索引构建,以建立起高效的查询基础。 2. **数据重建**:当索引数据出现损坏、数据结构需要更新或者业务需求发生变化时,可能需要对全量数据重新构建索引。 3. **全量数据查询**:在需要对整个数据集进行全面查询和分析时,全量索引可以提供更高效的查询性能。例如,进行数据统计、数据分析等操作时,全量索引可以快速定位到所需的数据。 ### 代码示例(以 Elasticsearch 的 Python 客户端为例进行全量索引数据读取) ```python from elasticsearch import Elasticsearch # 连接到 Elasticsearch es = Elasticsearch([{'host': 'localhost', 'port': 9200}]) # 定义索引名称 index_name = 'your_index_name' # 使用 Scroll API 进行全量数据读取 scroll_size = 1000 scroll = '1m' # 设置滚动时间为 1 分钟 # 初始化滚动查询 response = es.search( index=index_name, body={"query": {"match_all": {}}}, size=scroll_size, scroll=scroll ) scroll_id = response['_scroll_id'] hits = response['hits']['hits'] # 处理第一批数据 for hit in hits: print(hit['_source']) # 继续滚动查询 while len(hits): response = es.scroll(scroll_id=scroll_id, scroll=scroll) scroll_id = response['_scroll_id'] hits = response['hits']['hits'] # 处理后续数据 for hit in hits: print(hit['_source']) # 清除滚动上下文 es.clear_scroll(scroll_id=scroll_id) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值