定义
该字段是mapping里的一个元数据字段,本意在索引阶段是否保留原文本的字段内容,可以指定截取多个字段的内容。
字段设置意义
- 节省空间
- 检索时返回需要的字段内容,减少网络开销
在type的mapping中配置形式如下:
{
"mappings": {
"_doc" : {
"_source": {
"excludes" : ["file"],
"includes" : []
},
"properties" : {
"file" :{
"type" : "text"
}
}
}
}
在索引数据后,获取数据,可以发现返回如下格式数据,重点关注_source字段里面的json为空。
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,,
"max_score": 1,
"hits": [
{
"_index": "my-index",
"_type" : "_doc",
"_id": "1",
"_score": 1,
"_source": {}
}
]
}
}
字段禁用的影响
- 无法使用update、update_by_query、reindex api接口。
- 无法进行索引修复
- 无法修改mappings或者analysis
- 无法查看源数据内容来调试查询或者聚合接口
禁用的目的是为了节省空间,如果不是特别需要可以考虑使用压缩的方式。因此强烈建议该配置打开。
推荐使用方法
正如上文提到的,禁用字段的_source,会引发一系列问题,尤其影响后续的数据迁移(reindex接口)。建议不要禁用该字段,为了实现:
- 节省空间
- 仅返回所需字段内容
如确实考虑到节省磁盘资源,可以开压缩。需要返回部分字段内容可采用source字段过滤方式。
source过滤
在search时指定_source配置,指定需要过滤的字段,支持正则表达式,很常见的使用方式,并且很方便。
如下面搜索方式即可包含f1,f2开头的字段,并且过滤以f3命名结尾的字段
GET /_search
{
"_source": {
"includes": [ "f1*", "f2*" ],
"excludes": [ "*f3" ]
},
"query": {
"match": {
"file: "hello world"
}
}
}
不足:
- 不能包含多字段(multi-fields)和字段别名( field aliases)
- source字段在luncene中是一个字段,存取会将source整个对象加载和解析。
elasticsearch可通过doc value fields、stored fields以及script fields等的配置方式来解决以上的不足,这些方式不在本文的讨论范围。
网友评论