文档章节

ES权威指南[官方文档学习笔记]-59 Complex core field types

强子大叔的码田
 强子大叔的码田
发布于 2014/05/30 13:52
字数 647
阅读 372
收藏 1

es:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/complex-core-fields.html

下一页:http://my.oschina.net/qiangzigege/blog/270951

内容

除了简单的数据类型,JSON还有null值,数组和对象,es都支持。

多值字段:
有可能我们想我们的标签字段包含好几个标签,可以用数组:
{ "tag": [ "search", "nosql" ]}
这没有什么特别的,任何字段可以包含0,1或者多个值,这跟一个全文字段产生多个分词道理是一样的。

这意味着,一个数组的所有值必须是同样的数据类型,你不能混杂两种数据类型,
如果你通过索引一个数组而创建了一个新的字段,es将使用第一个值的数据类型来决定整个字段的数据类型。

数组的元素没有顺序,你不能说第一个元素和最后一个元素,就是一个集合。

空字段
数组,可以为空,事实上,Lucene是没有办法存储空值的,所以,一个没有值的字段被认为是一个空的字段。

以下四种字段可以认为是空的,不会被索引:
"empty_string":             "",
"null_value":               null,
"empty_array":              [],
"array_with_null_value":    [ null ]

多层对象
最后一个JSON数据类型是对象object,比如哈希,字典和数组。

数据对象嵌套是常见的,比如:

{
    "tweet":            "Elasticsearch is very flexible",
    "user": {
        "id":           "@johnsmith",
        "gender":       "male",
        "age":          26,
        "name": {
            "full":     "John Smith",
            "first":    "John",
            "last":     "Smith"
        }
    }
}

内部对象的映射
es会探测到新的对象字段并且映射为object类型,
映射如下:
{
  "gb": {
    "tweet": { 
      "properties": {
        "tweet":            { "type": "string" },
        "user": { 
          "type":             "object",
          "properties": {
            "id":           { "type": "string" },
            "gender":       { "type": "string" },
            "age":          { "type": "long"   },
            "name":   { 
              "type":         "object",
              "properties": {
                "full":     { "type": "string" },
                "first":    { "type": "string" },
                "last":     { "type": "string" }
              }
            }
          }
        }
      }
    }
  }
}

内部对象如何被索引?
Lucene不知道内部对象,一个Lucene文档包含一个平级的k/v结构。
为了让es索引内部对象,我们的文档会转化如下:
{
    "tweet":            [elasticsearch, flexible, very],
    "user.id":          [@johnsmith],
    "user.gender":      [male],
    "user.age":         [26],
    "user.name.full":   [john, smith],
    "user.name.first":  [john],
    "user.name.last":   [smith]
}
Lucene仅仅索引简单的值,不是复杂的结构。

内部对象数组

最后,思考下,一个内部对象数组如何被索引,
比如说如下:

{
    "followers": [
        { "age": 35, "name": "Mary White"},
        { "age": 26, "name": "Alex Jones"},
        { "age": 19, "name": "Lisa Smith"}
    ]
}
这个文档将被转化如下的结构

{
    "followers.age":    [19, 26, 35],
    "followers.name":   [alex, jones, lisa, smith, mary, white]
}
那么{age: 35} 和 {name: Mary White} 已经丢失了
Is there a follower who is 26 years old?
这个可以回答

Is there a follower who is 26 years old and who is called Alex Jones?
这个问题就无法回答。
后续再讨论这个问题。

 

 

© 著作权归作者所有

强子大叔的码田

强子大叔的码田

粉丝 922
博文 1490
码字总数 1246722
作品 9
南京
架构师
私信 提问
es不简易指南

1.nested Object mapping及查询 进阶:Elasticsearch之Nested(嵌套)系列、es权威指南-嵌套-查询、es权威指南-嵌套-对象(官方文档中文详细解释) 2.父子文档 进阶:Elasticsearch索引的父子关...

刘阳0292
2017/08/30
0
0
ES权威指南(中文版)学习_1

1、在ES中存储数据的行为叫做 索引(indexing),不过在索引之前我们应该明确的是数据应该存储在哪里。 2、在ES中,文档归属于一种类型(type),而这些类型存在于索引(index)中,类比传统...

MrYx3en
2015/09/21
162
0
Mac下安装Elasticsearch极简指南

Elasticsearch(以下简称ES)是一个面向文档的实时分布式搜索和分析引擎。本文是在Mac系统下使用Homebrew安装ES+Kibana+Marvel的一份极简指南。 前置条件 想要安装ES的前提是已经在本机安装了J...

郗南枫
2017/11/08
0
0
IT 技术数据&翻译 目录整理--Awesome-IT-Books

Awesome-IT-Books 本目录旨在集合各个优秀IT书籍&API翻译&官方Docs翻译。 这个仓库不产出书籍,只是将网上流传着的书籍&书籍翻译集合在一起,供大家检索学习。 在此先感谢那些为我们提供书籍...

charchen
2017/04/25
998
1
开源电子书

目录 语言无关类 操作系统 智能系统 分布式系统 编译原理 函数式概念 计算机图形学 WEB服务器 版本控制 编辑器 NoSQL PostgreSQL MySQL 管理和监控 项目相关 设计模式 Web 大数据 编程艺术 ...

zting科技
2017/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

0121 spring-boot-redis的使用

redis是什么呢?redis,属于NoSQL的一种,在互联网时代,起到加速系统的作用。 redis是一种内存数据库,支持7种数据类型的存储,性能1S 10w次读写; redis提供的简单的事务保证了高并发场景下...

李福春carter
20分钟前
28
0
redis的有序集合研究

假设执行下面的操作 jedis.zadd("myzset", System.currentTimeMillis(), "An error is returned when key exists but does not hold a sorted set.\r\n" + "\r\n" ......

强子大叔的码田
38分钟前
33
0
如何防止favicon.ico请求?

我没有favicon.ico,但IE总是提出请求。 是否可以阻止浏览器从我的网站请求favicon? 也许HTML标题中有一些META-TAG? #1楼 你不能。 您所能做的就是使该图像尽可能小,并在将来设置一些缓存...

技术盛宴
39分钟前
34
0
如何在Subversion中返回旧版本的代码?

我正和一位朋友一起开展一个项目,我想回到我们代码的旧版本并将其设置为当前版本。 我该怎么做? 我在vs08上使用“anksvn”。 我在我的电脑上有我想要的版本,但提交失败了; 我得到的消息是...

javail
54分钟前
62
0
全网最全RabbitMQ总结,别再说你不会RabbitMQ

RabbitMQ入门教程 当初我学RabbitMQ的时候,第一时间就上GitHub找相应的教程,但是令我很失望的是没有找到,Spring,Mybatis之类的教程很多,而RabbitMQ的教程几乎找不到,看的最多的就是朱小...

erlieStar
今天
52
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部