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" : ,
"timed_out" : false,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"hits" : {
"total" : ,
"max_score" : null,
"hits" : [ ]
}
}
此时,不指定字段查询,已经查不出数据了
使用include_in_all的选项,将赋予更高的灵活性,灵活性不仅体现在空间存储上,同样体现在查询的表现方式上。如果一次搜索在没有指定字段的情形下运行,ES只会匹配_all所包含的字段。
Elasticsearch-如何控制存储和索引文档(_source、_all、返回源文档的某些字段)的更多相关文章
- elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))
一.分词器 1. 认识分词器 1.1 Analyzer 分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如 ...
- mongodb底层存储和索引原理——本质是文档数据库,无表设计,同时wiredTiger存储引擎支持文档级别的锁,MMAPv1引擎基于mmap,二级索引(二级是文档的存储位置信息『文件id + 文件内offset 』)
MongoDB是面向文档的数据库管理系统DBMS(显然mongodb不是oracle那样的RDBMS,而仅仅是DBMS). 想想一下MySQL中没有任何关系型数据库的表,而由JSON类型的对象组成数据 ...
- ElasticSearch(六)底层索引控制
相似度算法 涉及到了ES的底层,首先讲一下ES的底层核心,相似度模型,ES的查询和传统的数据库查询最大的差别就在相似度查询(之前讲过,索引存储的最大差别就是讲非结构化数据转化为结构化),ES里面会给文 ...
- 一文带您了解 Elasticsearch 中,如何进行索引管理(图文教程)
欢迎关注笔者的公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site/ ...
- ElasticSearch之 控制相关度原理讲解
控制相关度 相关度评分背后的理论 如何计算评分的 Lucene 使用布尔模型(Boolean model) 查找匹配文档 并主要的借鉴了 词频/逆向文档频率(term frequency/invers ...
- [Elasticsearch] 分布式文件存储
本文翻译自Elasticsearch官方指南的distributed document store一章. 分布式文档存储 在上一章中,我们一直在介绍索引数据和获取数据的方法.可是我们省略了非常多关于数 ...
- Elasticsearch-基础介绍及索引原理分析(转载)
最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计查询的方案设计工作,花了些时间学习Elasticsearch的基础理论知识,整理了一下,希望能对Elastic ...
- Elasticsearch-基础介绍及索引原理分析
介绍 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 L ...
- elasticsearch简介和倒排序索引介绍
介绍 我们为什么要用搜索引擎?我们的所有数据在数据库里面都有,而且 Oracle.SQL Server 等数据库里也能提供查询检索或者聚类分析功能,直接通过数据库查询不就可以了吗?确实,我们大部分的查 ...
随机推荐
- MySQL的密码操作命令
一.请问在win2K命令提示符下怎样更改mysql的root管理员密码? >mysql -u root -p Enter password: ****** mysql> use mysql ...
- hdu 5834 四面体 观察+暴力
Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 13107 ...
- vue子路由设置、全局组件、局部组件的原生写法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 这一次,彻底弄懂「Java字节码文件」
提前祝福各位读者
- C++回调函数、静态函数、成员函数踩过的坑。
C++回调函数.静态函数.成员函数踩过的坑. 明确一点即回调函数需要是静态函数.原因: 普通的C++成员函数都隐含了一个this指针作为参数,这样使得回调函数的参数和成员函数参数个数不匹配. 若不想使 ...
- JavaWeb_(Hibernate框架)使用c3p0与Dbutils开发用户注册功能
使用c3p0与Dbutils开发用户注册功能: 用户在register.jsp表单成功后,页面跳转到login.html,数据库中会存放用户注册的信息 <%@ page language=&qu ...
- Ranger使用solrCloud存储审计日志
Ranger使用solrCloud存储审计日志 标签(空格分隔): Ranger 1, Zookeeper 搭建 1,忽略.默认已经搭建好zk 集群. VECS17820:2181,VECS17821 ...
- 域内信息收集 powershell收集域内信息
POwershell收集域内信息 Powershell(你可以看做CMD的升级版 但是和cmd完全不一样) 原来的powershe是不能执行任何脚本的 更改执行策略 这个是一个绕过的脚本 接下来我们了 ...
- Windows环境下Zookeeper的安装和部署(单机模式和伪集群模式)
第一部分:单机模式 1)下载地址:http://www.pirbot.com/mirrors/apache/zookeeper/,建议下载stable版本 2)解压缩 将下载好的压缩包解压到指定目录, ...
- oracle中监听程序当前无法识别连接描述符中请求服务 的解决方法
早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误,帮其解决后,发现很多人遇到过这样的问题,因此写着这里. ...