Elasticsearch-如何控制存储和索引文档(_source、_all、返回源文档的某些字段)
Elasticsearch-如何控制存储和索引文档(_source、_all)
_source:可以在索引中存储文档。
_all:可以在单个字段上索引所有内容。
1. 存储原有内容的_source
_source字段按照原有格式来存储原有的文档。这一点可以看到匹配某个搜索的文档,而不仅仅是他们的ID。
_source字段的enabled可以设置为true或者false,来指定是否需要存储原始的文档。默认情况下是true,在很多情况下,设置为true还是非常有用的,因为_source的存在允许使用其他重要的ES特性。(由于很多功能都依赖于_source,而且从空间和性能的角度来看存储的成本相对低廉,在版本2.0中将无法再关闭_source选项。)
为了理解这个字段是如何工作的,来看下当检索某篇之前索引的文档时,ES通常返回什么:
(1) 先索引一篇文档
curl -XPUT 'localhost:9200/music/album/5?pretty' -d '{ "name":"七里香", "date":"2004-08-03", "songs":["七里香","搁浅"] }'
(2) 检索
FengZhendeMacBook-Pro:cv FengZhen$ curl 'localhost:9200/music/album/5?pretty'
{
"_index" : "music",
"_type" : "album",
"_id" : "5",
"_version" : 1,
"found" : true,
"_source" : {
"name" : "七里香",
"date" : "2004-08-03",
"songs" : [ "七里香", "搁浅" ]
}
}
搜索的同时,会获得_source的JSON,因为这是默认设置会返回的内容。
2. 仅仅返回源文档的某些字段
当检索或者搜索某篇文档的时候,可以要求ES只返回特定的字段,而不是整个_source.一种实现的方法是在fields参数中提供用逗号分隔的字段列表。如下
FengZhendeMacBook-Pro:cv FengZhen$ curl -XGET 'localhost:9200/music/album/5?pretty&fields=name'
{
"_index" : "music",
"_type" : "album",
"_id" : "5",
"_version" : 1,
"found" : true,
"fields" : {
"name" : [ "七里香" ]
}
}
如果_source已经被存储,ES从那里获取所需的字段。也可以通过设置store选项为yes来存储个别的字段。举个例子,如果只需要存储test_name字段,映射如下
curl -XPUT 'localhost:9200/music/_mapping/test' -d '{ "test":{ "properties":{ "test_name":{ "type":"string", "store":"yes" } } } }'
向ES请求特定的字段时,这样做可能会很有帮助,原因是相对于检索整个_source然后再抽取而言,检索单一的存储字段要更快一些,尤其是在文档很大的时候。
注意:当存储单独的字段时,应该考虑到存储的越多,索引越大。更大的索引经常意味着更慢的索引和搜索速度。
就其内部来看,_source只是另一个Lucene中的存储字段。ES将原始的JSON存储于其中,然后按需抽取字段。
3. 索引一切的_all
_all是索引所有的信息。当搜索_all字段的时候,ES将在不考虑是哪个字段匹配成功的情况下,返回命中的文档。当用户不知道在哪里查询某些内容的时候,这一点非常有用。
从URI上运行搜索时如果不指定字段名称,系统默认情况下将会在_all上搜索:
curl 'localhost:9200/music/album/_search?pretty' -d '{ "query":{ "query_string":{ "query":"八度空间" } } }'
如果总是在特定的字段上搜索,可以通过设置enabled为false来关闭_all:
"events":{ "_all":{"enabled":false} }
如此设置会使得索引的规模变得更小,而且索引操作变得更快。
默认情况下,include_in_all隐式的设置为true,每个字段都会包含在_all之中。可以使用这个选项来控制哪些字段被_all包含,而哪些不被_all包含。
(1).将test_date字段设置为不在_all中
curl -XPUT 'localhost:9200/music/_mapping/test' -d '{ "test":{ "properties":{ "test_date":{ "type":"date", "include_in_all":false } } } }'
(2).索引新文档
curl -XPUT 'localhost:9200/music/test/1?pretty' -d '{ "test_name":"八度空间", "test_date":"2002-07-18", "test_songs":["半兽人","回到过去","米兰的小铁匠","最后的战役"] }'
(3).查询
FengZhendeMacBook-Pro:cv FengZhen$ curl 'localhost:9200/music/test/_search?q=2002-07-18&pretty' { "took" : 3, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 0, "max_score" : null, "hits" : [ ] } }
此时,不指定字段查询,已经查不出数据了
使用include_in_all的选项,将赋予更高的灵活性,灵活性不仅体现在空间存储上,同样体现在查询的表现方式上。如果一次搜索在没有指定字段的情形下运行,ES只会匹配_all所包含的字段。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2018-06-30 SpringCloud-高可用的分布式配置中心(config)
2018-06-30 SpringCloud-分布式配置中心(config)
2018-06-30 SpringCloud-路由网关(Zuul)
2018-06-30 SpringCloud-断路器(Hystrix)
2018-06-30 SpringCloud-服务的消费者(Feign)
2018-06-30 SpringCloud-服务的消费者(rest+ribbon)
2018-06-30 SpringCloud-服务的注册与发现(Eureka)