想象你走进一座藏书百万册的图书馆,没有楼层指引、没有分区标识,只有一个聪明的图书管理员。你问:“我想找一本关于人工智能的入门书。”管理员确实很聪明,他能理解你的意思,但他需要在整座图书馆里上下翻找——从一楼到五楼,从文学区到历史区,最后花了半小时才找到一本还算相关的书。现在,换一座图书馆:进门就是巨大的标识牌——“一楼:计算机类”、“二楼:文学类”、“三楼:历史类”。管理员根据你的问题直奔一楼,再通过出版年份、作者等标签,几分钟就找到了最佳推荐。 这就是RAG(检索增强生成)系统中元数据过滤的力量。RAG系统让大语言模型在回答问题前先检索相关资料,但光靠“语义理解”就像那个聪明的管理员——理解力再强,在百万文档中大海捞针也费时费力。元数据,就是文档的“楼层标签”和“分类编号”。在检索前先用这些标签筛掉明显不相关的文档,系统就能又快又准地找到答案。

岗位关联

掌握元数据过滤,你能让RAG系统从“半小时找一本书”进化到“几秒钟精准定位”,直接提升检索精度、降低延迟,还会显著影响最终回答质量。这是RAG应用工程师和大模型应用开发者的必备技能。

目录
  1. 可视化演示
  2. 检索困境背景
  3. 核心概念类型
  4. 设计实现方法
  5. 向量检索配合
  6. 实战技巧策略
  7. 常见陷阱避坑
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

\u5c55\u793aRAG\u7cfb\u7edf\u4e2d\u5143\u6570\u636e\u9884\u8fc7\u6ee4\u7f29\u5c0f\u68c0\u7d22\u8303\u56f4\u7684\u8fc7\u7a0b(DB\u2192META\u2192VEC\u2192RES)\uff0c\u4ee5\u53ca\u5e38\u7528\u5143\u6570\u636e\u5b57\u6bb5\u4f53\u7cfb\u8bbe\u8ba1\u3002

本节配有交互动效(进入视口后自动加载,约 3KB)。

\u8fc7\u6ee4\u6d41\u7a0b\u6a21\u5f0f \u9884\u8fc7\u6ee4: DB\u2192META\u7b5b\u9009\u2192VEC\u5411\u91cf\u68c0\u7d22\u2192RES\u7ed3\u679c \u7eff\u8272=\u901a\u8fc7\u8fc7\u6ee4\u7684\u6587\u6863\uff0c\u7070\u8272=\u88ab\u7b5b\u9664 Pre-filter: Meta \u2192 Vector \u2192 TopK

检索困境背景

图书馆的第一次变革发生在人们意识到“管理员再聪明,也得一摞一摞翻书”的那一刻。RAG系统面临同样的问题:当知识库从一千篇文档增长到一百万篇时,语义检索就好比管理员的“语义理解”——他能抓住你问题的意思,却依然要在百万文档中逐一比对向量相似度。这种暴力匹配不仅慢,而且容易“误伤”——从相似的措辞中找出语义完全不同、或早已过时、或权限不符的文档。

于是,图书馆里出现了楼层标识和分类标签。在RAG中,这些标签就是元数据(Metadata):文档的类型、创建时间、作者、所属领域、权限级别等描述性信息。元数据过滤的思路非常朴素:在语义检索之前,先用这些结构化的标签把明显不相关的文档排除在外。就像管理员先根据“计算机类”“2023年出版”这些硬性条件缩小范围,再做语义匹配。

技术上的实现路径清晰而优雅:系统维护一个元数据索引,在向量检索时将它转换为过滤条件(Filter),与向量相似度检索同时执行或提前执行。这样既能保证语义相关性,又能确保结果符合时间、领域、权限等硬性约束。这场检索的变革,本质上是把“全部翻一遍”变成“知道该去哪一层找”。

核心概念类型

既然要打上标签,就得先搞清楚标签有哪些“品类”。图书馆的标签至少分三层:物理层(哪层楼)、逻辑层(什么分类)、时效层(哪年入库)。RAG中的元数据同样需要分类设计,通常包含三大类:

第一类是结构化元数据,它对应图书馆的“楼层号”和“书架编号”。这类元数据有明确的取值,可以直接做等值匹配和范围过滤。比如文档的语言(zh/en/ja)、文档类型(PDF/Word/Markdown)、发布日期(2023-01-01)、权限级别(public/internal/confidential)。它们就像图书馆的硬性分区,说一不二。

第二类是文本型元数据,对应图书馆书脊上的“关键词标签”。这类元数据本身是半结构化的文本,如文档的标题、作者、摘要中的关键词。虽然在过滤时不那么精确,但可以辅助做全文检索,比如“找出作者是张伟的所有文档”。

第三类是派生元数据,它是图书馆在后期给书重新贴的标签——比如“这本《AI导论》被借阅了300次”。RAG系统可以动态统计文档的被引用次数、最近访问时间、质量评分等,这些派生字段在过滤时往往比静态标签更有价值。

在设计元数据时,有一个黄金原则:每个字段都有明确的业务语义和过滤价值。宁可少而精,不可多而杂。每次在过滤条件中新增一个字段,都要问自己:这个字段真的能帮我缩小检索范围吗?如果答案是“不确定”,它可能只是噪声。

设计实现方法

讲完了“标签”,现在说说怎么布置这些标签。图书馆的导引系统设计分两步:入口处的大屏(粗筛)和书架旁的细标(精筛)。RAG中的元数据过滤同样呈现双阶段架构:

第一阶段是预过滤:系统在向量检索前,根据用户问题或会话上下文,自动推断出当前场景的元数据约束。比如用户是美国区的客服,就自动加上“region=US“的过滤条件;用户问的是2023年的事,就加上”year>=2023”。这一阶段的价值是缩小候选集,通常能过滤掉90%以上的无关文档。

第二阶段是精排过滤与检索联合执行:在向量检索时,系统把过滤条件嵌入查询表达式,让向量数据库在计算相似度的同时应用过滤逻辑。业界主流的向量数据库(如Milvus、Pinecone、Weaviate)都支持这种“带过滤的向量检索”。这个阶段的价值是保证准确性——即使语义相似度再高,如果元数据不匹配,也绝不返回。

实现层面,过滤条件的构建有一套完整的表达式语言,通常支持以下操作:等值匹配(type = "paper")、范围过滤(year >= 2023)、集合匹配(language IN ("zh", "en"))、布尔组合(region = "US" AND year >= 2023)。这套表达式被编译为向量数据库的原生查询语句,在索引层面高效执行。

Candidates=σmetadata(D)∩TopKvector(Q)\text{Candidates} = \sigma_{\text{metadata}}(D) \cap \text{TopK}_{\text{vector}}(Q)

1. 元数据筛选 σ:这是预过滤操作,σ 的下标 metadata 表示过滤条件,比如 year >= 2023,执行结果是原始文档库 D 的一个子集。

σmetadata(D)\sigma_{\text{metadata}}(D)

2. 向量检索 TopK:在候选子集上做语义相似度计算,取最相似的前 K 个文档,K 是预设的返回数量。

TopKvector(Q)\text{TopK}_{\text{vector}}(Q)

3. 交集运算 ∩:表示最终结果必须同时满足“元数据通过”和“向量高相似”两个条件,这是双阶段过滤的数学表达。

Candidates=σmetadata(D)∩TopKvector(Q)\text{Candidates} = \sigma_{\text{metadata}}(D) \cap \text{TopK}_{\text{vector}}(Q)

回到图书馆的例子:预过滤是入口大屏的楼层指引,精排是书架上的细标。双阶段配合,既不过度消耗计算资源,又保证检索质量。

向量检索配合

现在最核心的问题来了:元数据过滤和向量检索,到底怎么配合?很多人误以为元数据过滤是“替代”向量检索的,实际上两者是接力关系——先过滤,再向量检索。

传统的向量检索是“全校海选”:把用户的问题编码成一个高维向量,然后在整个文档库中计算向量相似度。这种方式在百万级文档中会产生两个致命问题:一是计算量大、响应慢;二是语义相似不等于真正相关——比如用户问“苹果”时,可能同时匹配到“水果苹果”和“苹果公司”的财报,而元数据(比如领域标签)就能精准区分这两种场景。

引入元数据过滤后,流程变成了这样:系统先根据上下文确定过滤条件,将百万级文档快速缩水到万级甚至千级,然后只在这部分子集上做向量检索。这不仅仅是性能优化,更是精度革命——过滤掉的文档根本没有机会干扰语义匹配,召回结果天然更干净。

为了实现高效的先滤后检,底层需要倒排索引撑腰。倒排索引是图书馆的“书目标签卡”:每个标签后面挂着一串文档ID。当过滤条件是"type=paper AND year=2023"时,系统直接取两个标签对应的文档ID集合,做一次交集运算,就能毫秒级得到候选集。现代向量数据库(Milvus、Elasticsearch、Qdrant)都混合部署了倒排索引和向量索引,让过滤和向量检索同步执行。

更进一步,混合检索已经成为行业标配。除了向量相似度,系统还会并行计算关键词匹配分(BM25)和元数据过滤分,最后做加权融合。这样即使用户的语义表达不够精准,精确的关键词和元数据约束也能兜住底线。三重保险,检索效果自然大幅提升。

实战技巧策略

元数据过滤方案落地时,有一些实战级别的技巧,能让最终效果产生质的飞跃。

首先是最容易忽略的字段设计技巧。设计元数据字段时,不要只盯着“文档有什么”,要问“用户会怎么筛”。卖点在于“面向查询设计字段”——比如你的知识库里有大量带版本号的API文档,与其让用户自己过滤版本号,不如设计一个 is_latest 布尔字段,每次更新文档时自动置位。这样过滤条件的表达更简洁,索引效率也更高。

其次是缓存优化策略。元数据过滤的一个隐藏红利是:过滤后的候选子集往往在短时间内高度稳定。比如“2023年计算机类论文”这个子集,在一周内可能只新增几十篇文档。对这类子集建立缓存索引,可以大幅减少重复的过滤计算。高并发场景下,过滤阶段加上 Redis 缓存,检索延迟能再降一个数量级。

第三是效果评估方法。建立一套评估指标来检验过滤是否真的在起作用。常用的评估维度包括:检索精度(Precision@K,返回结果中有多少是真正相关的)、召回率(Recall@K,所有相关文档中有多少被返回了)、过滤率(Filter Ratio,被过滤掉的文档比例)。理想状态下,过滤率应该在90%以上,同时精度提升、召回率不降——如果召回率显著下降,说明过滤条件过于严苛,正在“误伤”相关文档。

常见陷阱避坑

元数据过滤看似简单,实践中却暗藏几处深水区,新手极易踩坑。

陷阱一:过度过滤导致召回率暴跌。 这是最经典的翻车场景。过滤条件是“双刃剑”——它同时剔除了不相关文档和相关文档。如果过滤条件过于严格(比如要求三个字段全部精确匹配),很容易把本是正确答案的文档拦在门外。就像图书馆管理员知道三楼有本《AI导论》,但因为它显示“2022年出版”,被你“只要2023年后”的过滤条件排除在外,结果答不上来问题。

陷阱二:元数据缺失造成的“隐形门”。 数据导入时如果漏填了元数据字段,过滤后这些文档会直接“消失”。更隐蔽的是,规则引擎处理空值时默认行为可能不一致——有的系统把空值当作“不匹配”,有的当作“匹配”。这会导致同一套配置在不同文档上的行为不一致。对策是:对关键元数据字段做完整性校验,导入时发现缺失立即补齐;对空值语义做显式约定,比如统一约定“缺失即排除”。

陷阱三:静态元数据跟不上动态现实。 文档的权限会变(一篇论文可能先公开后转付费)、时效会变(“最新版”在三个月后就过时了)。如果元数据不更新,过滤结果就不再可靠。对策是:建立元数据生命周期管理机制,定期重跑文档解析流程,从文档头、文件系统或外部数据库重新拉取元数据,更新到向量数据库。

这些陷阱的共同根源是:把元数据过滤当成了“一次性配置”,而没有当做一个“需要持续维护的系统”。真正的生产级方案,必须为元数据建立“上游来源→清洗映射→同步更新→质量监控”的完整链路。

AI 应用场景

知识库客服系统:先分地域再检索

阶段:检索前处理(Retrieval Augmentation)

解决的问题:大型跨国企业的客服知识库包含产品手册、政策文档、本地化说明等数十万篇文档。用户问题高度依赖地域和产品线,纯语义检索经常返回其他地区的法规或不适用的产品文档,准确率仅65%。

具体案例:某电商平台的客服机器人,为每篇文档标记 region(站点地域)、product_line(产品线)、is_active(是否当前版本)。用户提问时,系统自动附加过滤条件 region=用户当前站点、product_line=用户咨询产品、is_active=true。上线后,检索精准度从65%提升到92%,平均响应时间从800ms降至120ms。

企业知识管理:时间窗口过滤

阶段:检索后处理

解决的问题:企业内部知识库的文档更新频繁,“旧文档”经常与“新文档”冲突。管理者希望检索结果以最新政策为准,但纯语义检索无法感知时间权重。

具体案例:某金融机构的合规问答系统,为文档标注 effective_date 和 is_superseded(是否被替代)字段。每次查询时自动附加 effective_date <= 今天 且 is_superseded = false。这样系统永远不会推荐已经作废的旧制度,合规审计时也能追溯查询依据。该方案使合规相关回答的准确率从71%提升至95%。

学术文献助手:按领域和年份精筛

阶段:检索优化

解决的问题:科研人员在海量论文中找相关工作时,纯语义检索返回的主题太散、跨领域严重,且常出现十年前的过时结论。

具体案例:一款面向医学研究者的文献综述工具,为每篇论文标记 domain(如肿瘤学/免疫学)、study_type(如临床试验/综述)、pub_year。研究者提问时通过界面勾选过滤条件,系统组合过滤条件实现精筛,将“我在找2020年后发表的免疫治疗临床试验”这类复杂检索从分钟级缩短到秒级。该工具上线三个月,日活用户突破2万。

Python 演示

python53 行
import pandas as pdfrom datetime import datetime, timedelta # 模拟100条文档及其元数据def generate_docs(n=100):    docs = []    now = datetime.now()    regions = ["US", "EU", "CN"]    categories = ["产品手册", "合规政策", "技术文档", "市场报告"]    for i in range(n):        docs.append({            "doc_id": i,            "title": f"文档{i}",            "region": regions[i % len(regions)],            "category": categories[i % len(categories)],            "published_at": now - timedelta(days=i % 30),            "is_active": (i % 5 != 0),  # 20%为已下架            "content": f"苹果 手机 发布 {i}",        })    return pd.DataFrame(docs) # 模拟向量检索,返回相似度最高的TopK文档IDdef vector_search(df, query_terms, topk=10):    scores = []    for _, row in df.iterrows():        s = sum(0.1 if t in row["content"] else 0 for t in query_terms)        scores.append((row["doc_id"], s))    scores.sort(key=lambda x: x[1], reverse=True)    return [doc_id for doc_id, s in scores[:topk]] def main():    df = generate_docs()    print(f"[初始] 文档总量: {len(df)}")     # 元数据过滤:降维候选集    filter_mask = (        (df["region"] == "US")        & (df["category"].isin(["产品手册", "技术文档"]))        & (df["is_active"] == True)        & (df["published_at"] >= datetime.now() - timedelta(days=15))    )    filtered = df[filter_mask]    print(f"[过滤后] 候选文档数: {len(filtered)}  (过滤率: {1-len(filtered)/len(df):.0%})")     # 在过滤后的子集上做语义向量检索    query_terms = ["苹果"]    topk_ids = vector_search(filtered, query_terms, topk=3)    result = filtered[filtered["doc_id"].isin(topk_ids)]    print(f"[检索结果] TopK命中: {result['doc_id'].tolist()}")    print(f"[对比] 不过滤时向量检索 TopK: {vector_search(df, query_terms, topk=3)}") if __name__ == "__main__":    main()
目的:演示“元数据预过滤 → 缩小候选集 → 向量检索”的完整管线,量化展示过滤对候选集规模的压缩效果。
  1. filter_mask = (...)这是整个过滤逻辑的核心,用四个条件组合成布尔掩码,一次过滤掉非US、非目标品类、已下架、超时的文档。
  2. filtered = df[filter_mask]Pandas的布尔索引,把mask为True的行筛选出来,形成候选子集。
  3. df["published_at"] >= datetime.now() - timedelta(days=15)时间窗口过滤,只保留15天内发布的文档,模拟“仅看最近内容”的需求。
  4. vector_search(filtered, query_terms, topk=3)在过滤后的子集上执行向量检索(此处用关键词打分模拟),返回TopK。
  5. len(df)` / `len(filtered)对比过滤前后的数量,直观展示“过滤率”这个概念。

常见误区

误区新手常认为,多加几个过滤条件(比如同时要求地区、品类、时间、权限全部匹配),检索结果一定更准。有一次我把条件加到5个,结果答案全都不见了。

正解过滤条件是把“双刃剑”——它同时剔除了不相关和相关文档。当条件过严时,它会把正确文档也拦在门外,导致召回率暴跌。正确的做法是“宁可放宽再精排”:过滤只用来排除明显不相关的大类,精排交给向量相似度去做。图书馆管理员的策略是“先锁楼层,再逐本细看”,而不是“进门就锁到某一本”。

为何常见:因为初学者容易把过滤理解成“最终的筛选手段”,但实际上它只是“缩小范围的粗筛工具”。在直觉上,“加条件=更精确”听起来合理,忽略了过滤在提升精度的同时付出的召回的代价。

误区有人以为元数据过滤可以替代向量检索——既然元数据已经筛掉了大部分文档,剩下那些是不是直接返回就行,不用再算语义相似度了?

正解这是对两者分工的根本误解。元数据过滤解决的是“范围”问题(哪些文档值得考虑),向量检索解决的是“语义”问题(哪些文档和问题最相关)。两者是接力关系而非替代关系。只做元数据过滤,返回的文档虽然都来自正确领域,但排序是乱的,相关度没有保障;只做向量检索,虽然排序合理,但可能混入错误领域的噪音。生产级RAG必然同时使用两者。

为何常见:因为“过滤”这个词容易让人联想到“清洗后直接用”,加上早期的一些技术博客会单独强调过滤的好处,导致认知偏差。

误区既然元数据有价值,那我为每个文档打上20个标签,过滤时随心所欲组合,岂不无敌?

正解元数据不是越多越好,因为每个字段都需要成本:存储成本、索引成本、维护成本。更重要的是,字段越多,数据质量就越难保证——某个字段大面积缺值,会导致过滤结果不稳定。工程师应该遵循“少而精”原则:只保留有明确过滤价值的字段,比如地区、品类、时间、权限、版本。每次新增字段前,问一句“用户真的会按这个字段筛选吗?”。

为何常见:这是“收集癖”心理的体现,尤其是数据建设初期,觉得字段多总比少好,忽视了后期数据治理的巨大成本。

误区上线时把元数据配好,之后就不用管了。文档的权限变了、版本更新了、标记过期了,都与我无关。

正解元数据具有生命周期。文档的状态在持续变化:一篇论文从公开转付费、一条政策被新政策替代、一份产品手册出了v3版。如果元数据不更新,过滤条件就像拿着旧版地图导航——地图没错,但现实已经变了。生产系统必须建立元数据同步机制:定期重跑解析流程、从上游系统拉取最新状态、用事件消息实时更新。RAG系统上线只是开始,元数据维护是持续的工程任务。

为何常见:因为初期的技术选型和开发工作让人把注意力都放在“搭建”上,容易忽视“运营”的长期性。元数据更新的频率不高,让人误以为它不会变。

面试题

Q1. 元数据过滤在RAG系统中最主要的作用是什么?

单选题 · easy

  • A.替代向量检索的全部功能
  • B.在检索前缩小候选文档范围← 正确答案
  • C.提升文档的存储安全性
  • D.加速大模型的推理速度

答案:B。元数据过滤的核心是“预筛选”——在向量检索前,用结构化标签排除不相关的文档,缩小候选集规模。它不替代向量检索(A错),也与存储安全(C)、模型推理(D)无关。

Q2. 以下哪一项属于结构化元数据的典型例子?

单选题 · easy

  • A.文档的正文内容
  • B.文档的发布时间← 正确答案
  • C.文档的段落总数
  • D.文档的图片数量

答案:B。结构化元数据是有明确取值、可直接做等值或范围过滤的字段,发布时间(B)符合这一定义。正文内容属于要检索的文本,不是元数据;段落数、图片数虽然可作为元数据,但它们是派生统计量而非文档自身的描述属性——该题目为标准题意考查。

Q3. 在“先过滤后检索”的架构中,过滤阶段通常使用什么索引实现毫秒级响应?

单选题 · mid

  • A.向量索引(HNSW)
  • B.倒排索引← 正确答案
  • C.B+树索引
  • D.哈希索引

答案:B。倒排索引是“标签→文档ID集合”的映射,适合做集合交集运算(如"type=paper AND year=2023"),是过滤阶段的底层支柱。向量索引用于语义相似度检索,B+树和哈希索引在文档数据库的文件组织中使用,生产级向量数据库中过滤通常依赖倒排索引。

Q4. 元数据过滤可能导致的最严重后果是什么?

单选题 · mid

  • A.存储成本上升
  • B.召回率显著下降,漏掉相关文档← 正确答案
  • C.向量维度增加
  • D.大模型输出变短

答案:B。过滤条件是双刃剑,条件过严会排除相关文档,直接导致召回率下降,系统“答不上来”。存储成本(A)和向量维度(C)与用户的过滤行为无关,模型输出长度(D)更是无关项。设计过滤条件时,必须监控召回率指标。

Q5. 在设计元数据字段时,最推荐遵循什么原则?

单选题 · mid

  • A.字段越多越好,覆盖所有场景
  • B.只保留有明确过滤价值的字段← 正确答案
  • C.全部用文本类型,方便全文检索
  • D.字段命名越长越好,避免歧义

答案:B。设计元数据要“面向查询”,只保留用户真正会用来筛选的字段。字段过多会带来存储、索引、维护成本,还会因数据缺失导致过滤行为不稳定。文本类型(C)适用于部分场景但不是万能解,字段命名(D)清晰即可、不是越长越好。

Q6. 以下哪些场景适合用元数据过滤来提升RAG检索效果?

多选题 · mid

  • A.按地域过滤客服知识库文档← 正确答案
  • B.按时间窗口只看最近的政策← 正确答案
  • C.按相似度过滤重复文本
  • D.按权限级别限制可见文档← 正确答案

答案:ABD。地域(A)、时间窗口(B)、权限级别(D)都是硬性约束条件,元数据可以精确表示并高效过滤。而“相似度过滤重复文本”(C)本质上是语义任务,需要向量计算而非元数据精确匹配。

Q7. 关于元数据过滤与向量检索的配合方式,以下说法正确的是?

多选题 · mid

  • A.过滤在先,向量检索在后← 正确答案
  • B.向量检索在先,过滤在后
  • C.两者可以同时执行而非串行← 正确答案
  • D.过滤可以完全替代向量检索

答案:AC。经典架构是“先过滤缩小候选集,再向量检索精排”(A对)。现代向量数据库支持过滤条件与向量相似度计算同时执行(C对),不必强制串行。流程是“过滤→向量检索”,不是反过来(B错)。过滤与向量检索解决不同问题,不能互相替代(D错)。

Q8. 以下哪项是过滤字段空值(null)时的最佳实践?

单选题 · hard

  • A.将空值字段的文档直接丢弃
  • B.约定空值语义并保持全局一致← 正确答案
  • C.将空值当作“匹配所有条件”
  • D.将空值转为随机值填充

答案:B。空值处理的关键是“一致性和确定性”。不同的系统对空值的默认行为不同——有的当作“不匹配”,有的当作“匹配”,这会导致行为不一致。最佳实践是显式约定(比如统一“缺失即排除”),并做完整性校验。A太粗暴(误伤无字段的合法文档),C/D会引入不可预测的语义。

Q9. 如何利用元数据过滤提升RAG系统的检索性能?

单选题 · hard

  • A.在向量检索后增加一次元数据过滤,减少精排时间
  • B.在向量检索前用元数据缩小候选集,降低向量计算量← 正确答案
  • C.将元数据直接拼接到用户问题中
  • D.降低向量维度来同时提升性能

答案:B。性能提升的关键在于“在昂贵的向量相似度计算之前”排除大量文档。把过滤放在向量检索前,计算量直接按过滤率倍减。A在检索后过滤虽然能修正结果,但无法节省计算成本;C与性能无关;D降低向量维度会损害检索质量。因此B是最佳实践。

Q10. 一个RAG系统希望“绝不过期政策”被检索到,应设计哪些元数据?

多选题 · hard

  • A.effective_date(生效日期)← 正确答案
  • B.is_superseded(是否被替代)← 正确答案
  • C.view_count(被查看次数)
  • D.is_active(是否当前有效)← 正确答案

答案:ABD。要保证检索结果不包含过期政策,应该设计生效日期(A)、是否被替代标志(B)、是否当前有效(D)三个字段,检索时附加“生效日期<=今天 AND 未被替代 AND 有效”。被查看次数(C)属于派生统计量,无法表达文档的时效状态,且过滤价值较低,因此不选。