ES中的nested对象

栏目: 后端 · 发布时间: 6年前

内容简介:我们知道ES的一个索引会对应着多个分片和副本,而每一个分片或副本就是一个完整的Lucene索引。Elasticsearch在索引数据时,会对输入的数据进行解析,得到一个个单独的字段。ES本身还会添加一些额外的字段,最后把这些字段作为一个文档保存到Lucene中,ES自身额外添加的field:从原始输入中解析出相应字段的源码

我们知道ES的一个索引会对应着多个分片和副本,而每一个分片或副本就是一个完整的Lucene索引。

ES索引 -> ES分片 -> Lucene索引

Elasticsearch在索引数据时,会对输入的数据进行解析,得到一个个单独的字段。ES本身还会添加一些额外的字段,最后把这些字段作为一个文档保存到Lucene中,ES自身额外添加的field: _uid , _source , _type , _version

从原始输入中解析出相应字段的源码 在此 ,在这里我们看到nested会把当前的document作为自己的parent,nested字段会使用其parentDoc的_uid作为自己的_uid,这就意味着nested字段是和其parent文档拥有一样的_uid的。

在上一步解析出了数据中的字段之后,ES把所有解析得到的字段存放到 ParsedDocument 中,具体源码 在此

最终ES把所有的字段存储到Lucene中,一个文档中所有字段的 _uid 都是一样的,所有的字段在存储时都使用这个相同的 _uid。ES根据版本决定这个数据是更新还是新增,版本比较以及数据写入到Lucene的源码 在此 。ES会给每个nested的数据创建一个独立的Lucene document,所以一次写入一共有 nested + 1 个文档数量。如果一个字段不是nested,就普通的解析一下变成单个字段然后存放在主document中进行保存。

例如如下的文本

{
    "city": "Nanjing",
    "comments": [
        {
            "name": "Mike",
            "comment": "Great"
        },
        {
            "name": "Mark",
            "comment": "Interesting"
        }
    ]
}

如果comments是一个普通的字段,那么ES通过解析操作我们可以得到如下的字段

city: Nanjing
comments.name: Mike
comments.comment: Great
comments.name: Mark
comments.comment: Interesting

这些字段存放在一个文档中,之后该文档被保存到Lucene。

这样保存的一个问题在于comments的name和comment字段之间失去了关联,如下的一个文本将会和上面的文本生成完全一样的字段:

{
    "city": "Nanjing",
    "comments": [
        {
            "name": "Mark",
            "comment": "Great"
        },
        {
            "name": "Mike",
            "comment": "Interesting"
        }
    ]
}

这个文本生成的字段如下

city: Nanjing
comments.name: Mark
comments.comment: Great
comments.name: Mike
comments.comment: Interesting

这里生成的字段和上面的文本完全一致,所以如果我们想要查询 comments.name == Mike && comments.comment == Great 的结果,那么这两条数据都是符合要求的,但这可能不是我们想要的结果,我们也许只想要查询第一条数据而已。

但是如果comments是一个nested类型的字段,那么ES就会把这段文本解析为三个文档,分别为

// document1
city: Nanjing
// document2
comments.name: Mike
comments.comment: Great
// docuemtn3
comments.name: Mark
comments.comment: Interesting

这段文本被拆分为三个document保存到Lucene中,这样一来comments的name和comment就产生了关联,此时进行查询 comments.name == Mike && comments.comment == Great,那么就只有该条数据才是符合要求的。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

服务设计与创新实践

服务设计与创新实践

宝莱恩 (Andy Polaine)、乐维亚 (Lavrans Lovlie)、里森 (Ben Reason) / 王国胜、张盈盈、付美平、赵芳 / 清华大学出版社 / 2015-6-1 / CNY 69.00

产品经济的时代渐行渐远,在以服务为主导的新经济时代,在强调体验和价值的互联网时代,如何才能做到提前想用户之所想?如何比用户想得更周到?如何设计可用、好用和体贴的服务?这些都可以从本书中找到答案。本书撷取以保险业为代表的金融服务、医疗服务、租车及其他种种服务案例,从概念到实践,有理有据地阐述了如何对服务进行重新设计?如何将用户体验和价值提前与产品设计融合在一起? 《服务设计与创新实践》适合产品......一起来看看 《服务设计与创新实践》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具