Solr字段同时设stored=true与docValues=true的取值优先级规则
Solr字段同时配置stored=true与docValues=true的取值规则
你提到的“排序、分面走docValues,普通查询返回字段走stored”的判断基本符合Solr的默认行为,但存在几个特殊场景的例外,具体规则没有模糊空间,按场景拆分如下:
不同操作的固定取值逻辑
- 排序(sort)、分面(facet)、分组(group)、聚合统计、函数计算类操作:只要字段开启了docValues,这类操作会100%从docValues读取数据,完全不会访问stored存储。
这是docValues本身的设计目的决定的:它是列式压缩存储,做排序、聚合时的读取性能远高于行式存储的stored字段。如果这类操作对应的字段没开docValues,哪怕stored设为true,Solr也不会读stored来计算,要么直接抛错,要么把全量字段值加载到内存fieldCache中计算,性能会出现明显下降。 - 普通搜索的结果字段返回(即通过fl参数指定返回该字段的场景):默认从stored存储取值返回,不会主动读取docValues。
这个默认逻辑的考量是stored为行式存储,单条文档的所有stored字段连续存储,批量返回多条结果的多个字段时,行存的读取效率比逐列读取docValues更高。 - 特殊取值场景:
- 如果你在fl参数中显式指定取值来源,比如写
fl=id:[docValue],Solr会强制从docValues读值返回,优先级高于默认逻辑;如果写fl=id:[stored]则强制从stored读取。 - 如果字段同时配置了
useDocValuesAsStored=true(Solr 6.0及以上版本中,字符串、数值类等常用字段类型默认开启该配置),当stored字段读取失败、或字段stored=false但docValues=true时,Solr会自动从docValues读取值返回,不会直接返回空值。
- 如果你在fl参数中显式指定取值来源,比如写
明确的优先级顺序
从高到低排列如下:
- 显式指定的fl取值规则:强制走指定的存储来源,覆盖所有默认逻辑
- 操作类型绑定的固定存储:排序、分面、聚合类操作固定走docValues,无fallback到stored的逻辑
- 结果返回场景的默认逻辑:优先读取stored存储;若stored不可用且开启了
useDocValuesAsStored=true,则fallback到docValues存储
补充说明:正常写入流程下,同一个字段的stored和docValues存储的内容完全一致,除非你自定义了字段转换类故意做差异化处理,否则不需要担心两个存储返回值不一致的问题。
内容的提问来源于stack exchange,提问作者Eli Johnes
相关产品推荐
相关产品推荐

