Selecting fields to return

Version:5.x

英文原文地址:Selecting fields to return

有时候,不需要让 Elasticsearch 返回查询的文档中的全部字段。举个栗子,当展示最近发布的博客时,在查找到最新的帖子后只需要返回博客的标题。

有两种方法可以用来返回文档中的部分字段,即部分文档(我们使用这个术语来描述)。一个是 stored fields ,另一个是 source filtering ,两者在工作方式上有很大的不同。

Stored fields

索引文档时,默认情况下,Elasticsearch 将最初发送的 JSON 文档存储在一个名叫 _source 的特殊字段中。从搜索查询返回的文档是 Elasticsearch 返回的每个命中的 _source 字段的具体化。

还可以在映射的时候使用 store ,把 JSON 文档中的字段分别存储在 Elasticsearch 中。为什么要这么做呢?你可能禁用了 _source 以便不存储源文档,并选择存储特定的字段。另一种可能性是,_source 包含一个具有较大值的字段(例如一篇博客的正文),但通常只需要另一个字段(例如博客的标题)。这种情况下,我们不想为了得到一个小字段而反序列化整个 _source

重要:选择禁用类型映射中的 _source ,意味着不存储发送到 Elasticsearch 的原始 JSON 文档,因此永远无法检索原始文档。虽然这样做可以节省磁盘空间,但与此同时某些功能(如 Reindex API 或者 highlighting)也将无法正常工作。

一定要认真考虑,禁用源文档是否真的符合你的需求。

以这种方式存储字段时,可以使用搜索请求的 .StoredFields() 方法来指定需要返回的字段

var searchResponse = client.Search<Project>(s => s
.StoredFields(sf => sf
.Fields(
f => f.Name,
f => f.StartedOn,
f => f.Branches
)
)
.Query(q => q
.MatchAll()
)
);

使用响应对象的 .Fields 属性检索它们

foreach (var fieldValues in searchResponse.Fields)
{
var document = new
{
Name = fieldValues.ValueOf<Project, string>(p => p.Name),
StartedOn = fieldValues.Value<DateTime>(Infer.Field<Project>(p => p.StartedOn)),
Branches = fieldValues.Values<Project, string>(p => p.Branches.First())
};
}

这种方法在单独存储字段时有效。然而,更常见的情况是从 _source 中返回选择的字段。这便是 source filtering 的由来。

Source filtering

搜索查询时使用 source filtering 可以返回文档的部分字段

var searchResponse = client.Search<Project>(s => s
.Source(sf => sf
.Includes(i => i
.Fields(
f => f.Name,
f => f.StartedOn,
f => f.Branches
)
)
.Excludes(e => e
.Fields("num*")
)
)
.Query(q => q
.MatchAll()
)
);

在请求中指定了源过滤之后,响应对象的 .Documents 就只包含部分文档了、

var partialProjects = searchResponse.Documents;

你也可以从查询中完全排除 _source

searchResponse = client.Search<Project>(s => s
.Source(false)
.Query(q => q
.MatchAll()
)
);

最新文章

  1. How do I remove javascript validation from my eclipse project?
  2. linux下rm -r误删NTFS文件恢复方法
  3. [转]REST简介
  4. cf#306D. Regular Bridge(图论,构图)
  5. OKR——Objectives and Key Results
  6. Yii 框架中带有区间的搜索
  7. lintcode: 生成括号
  8. WinForm 图形报表控件
  9. impress.js学习总结
  10. perl tk说明
  11. Swift - 纯代码实现页面segue跳转,以及参数传递
  12. php中获取各种路径
  13. ubuntu中vim下按上下左右键时输入A、B、C、D的问题
  14. Codeforces 558E A Simple Task
  15. Spring定时任务有时候会莫名奇妙的终止?
  16. [MySQL] timestamp和datetime的区别和大坑
  17. 自动化测试之路3-selenium3+python3环境搭建
  18. linux磁盘命令-lsblk显现磁盘阵列分组
  19. 不安全代码只会在使用 /unsafe 编译的情况下出现
  20. 让wampserver2.5.exe支持sql server数据库的方法

热门文章

  1. HBase详细概述
  2. 004_zookeeper运维之maxClientCnxns overflow
  3. Light OJ 1078
  4. LA 4108 (线段树)
  5. 【原创】Linux基础之测试域名IP端口连通性
  6. 协程,twisted
  7. JS访问SpringMVC后台
  8. git的学习笔记(一):git本地操作
  9. Confluence 6 为登录失败编辑,禁用和配置验证码
  10. Confluence 6 尝试从 XML 备份中恢复时解决错误