复杂的核心字段类型(Complex core field types)

除了前面已经提到的简单的数据类型,JSON也有null,array和object类型,这些都是被ES支持的。

Multi-value fields

我们想让我们的tag field的值多于一个而不是一个字符串,这个也是可能的,我们能把一个数组存储到tags:

{"tag":["search","nosql"]}

对数组来说,不许要特别的mapping。任何的field都可以包含若干个value,就像full text字段一样会被分词器拆分成多个terms。

这里也暗示了数组中所有的value的数据类型必须都要是一致的。你当然可以在string中混合使用了多种数据类型,但是在你存储一个数组的时候,ES会使用数组中的第一个元素的类型作为所有数组元素的类型。数组中的元素是无序的,你不能引用第一个元素或者是最后一个元素。你就当ES中的数组是对若干的value的一个打包就行了。

Empty fields


ES的field能存储array,当然array也可能是空值,这个就像当于存储了0个value。事实上,在Lucene中没有存储null的方式,因此一个field的值是null这个field就会当做empty
fields。这些empty field是不会被存储的,有一下四种形式的empty field:

"empty_string":             "",
"null_value":               null,
"empty_array":              [],
"array_with_null_value":    [null]

multi-level objects


我们将要讨论的最后一个原生的JSON数据类型就是object——就像在其他语言中广为人知的hash,hashmap,dictionary或者是关联array。内部的object常常用来嵌套一个实体类,或者其他的嵌套的object。例如,我们不把user_name,user_id放到tweet的document,我们能这样写:

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

mapping for inner objects


ES能动态的检测新的object field并且对object进行映射,每个object的field都在properties属性下:

{
  "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"}
              }
            }
          }
        }
      }
    }
  }
}

标记1表示的是根对象

标记2和3表示的是内部对象

how inner objects are indexed


Lucene是不是别内部对象的。一个Lucene的document识别的是key-value平行列表。为了ES能够存储object,他对document做了如下的转换:

{
    "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]
}

内部field都可以通过名称进行引用,为了区分两个内部object的相同的字段名,我们可以通过全路径进行引用,例如:"user.name.first"或者“tweet.user.name.first"。

在上面的扁平的document中,没有字段的名称是user也没有字段的名称是user.name。Lucene只是存储了简单的值,而不能存储复杂的数据结构。

arrays of inner objects


最后,看看内部object中的array是怎么存储的,假设我们有下名这个名为followers的数组:

{
    "followers":[
        {"age":35,"name":"Mary White"},
        {"age":26,"name":"Alex Jones"},
        {"age":19,"name":"Lisa Smith"}
    ]
}

这个document就会如下的扁平的存储:

{
    "followers.age":    [19,26,35],
    "followers.name":   [alex, jones, lisa, smith, mary, white]
}

{age:
35}
 和{name: Mary
White}的关系已经丢失了,因为每个multi-value字段是对values的打包,并且是无序的。我们可以这样问:

  • Is there a follower who is 26
    years old?

但是如果我们想下面这样问就得不到一个精确的答案:

  • Is there a follower who is 26
    years old and who is called Alex
    Jones?

内部object的关系, which are able to answer queries like
these,被内部类调用,我们稍后将会在 Related
Documents (TODO)
中进行讨论。

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

复杂的核心字段类型(Complex core field types),布布扣,bubuko.com

时间: 2024-10-21 22:30:19

复杂的核心字段类型(Complex core field types)的相关文章

django字段类型(Field types)介绍

字段类型(Field types) AutoField 它是一个根据 ID 自增长的 IntegerField 字段.通常,你不必直接使用该字段.如果你没在别的字段上指定主 键,Django 就会自动添加主键字段. BigIntegerField 64位整数,类似于IntegerField,范围从-9223372036854775808 到9223372036854775807.默认的form widget 是TextInput. BooleanField 一个布尔值(true/false)字段

Solr字段类型field type的定义

摘要: Solr的字段类型定义了Solr如何解析字段数据并将数据检索出来,了解Solr的字段类型定义有助于更好的配置与使用Solr. 字段类型的定义 字段类型的定义主要包含如下四个方面的信息: 名称 实现的类名 如果field type 是TextField,则可以指定字段解析器 字段类型属性 在schema.xml中定义的字段类型 字段类型在schema.xml中指定,每一个字段类型被定义在fieldType标签之间,下面这个例子是一个text_general的字段类型: <fieldType

python-django 模型model字段类型说明

V=models.CharField(max_length=None<, **options>) #varchar V=models.EmailField(<max_length=75, **options="">) #varchar V=models.URLField(<verify_exists=true, **options="" max_length="200,">) #varchar V=models

Django model字段类型清单

转载:<Django model字段类型清单> Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长.你通常不需要直接使用这个字段:如果你不指定主键的话,系统会自动添加一个主键字段到你的model.(参阅自动主键字段) BooleanField:布尔字段,管理工具里会自动将其描述为checkbox. CharField:字符串字段,单行输入,用于较短的字符串,

django model常用字段类型

摘自 http://www.cnblogs.com/wt869054461/p/4014271.html V=models.AutoField(**options) #int:在Django代码内是自增 V=models.DecimalField(max_digits=None, decimal_places=None<, **options>) #decimal V=models.FloatField(<**options>) #real V=models.BooleanFiel

django的Model 模型中常用的字段类型

常用的字段类型: AutoField:自增长字段,通常不用,如果未在Model中显示指定主键,django会默认建立一个整型的自增长主键字段 BooleanField:布尔型,值为True或False,在管理工具表现为checkbox CharField:单行字符串字段,CharField有一个必填参数:      CharField.max_length:字符的最大长度,django会根据这个参数在数据库层和校验层限制该字段所允许的最大字符数. TextField:textarea字段,即多行

10天学会phpWeChat——第八天:Form类,丰富表单提交的字段类型

通过前面七讲的系列教程,我们完成了一个包含后台并自适应PC+h5移动端的文章管理模块. 在实际的生产环境中,文章投稿.商品上传等操作并不会简单局限于一个text和textarea组成的表单.在实际中,我们可能会用到web富文本编辑器(如ueditor.markdown).图片上传.多图上传.附件上传.地图标注等更加丰富的表单类型. 今天,我们开始<10天学会phpWeChat>的第八讲:Form类,丰富表单提交的字段类型. 一.什么是Form类? Form类是phpWeChat封装好的一个类,

[PHPCMS V9二次开发]自定义字段模型-添加字段类型

步骤/方法 打开phpcms\modules\content\fields目录,复制文件夹downfiles,并改名为textgroups. 打开phpcms\modules\content\fields\fields.inc.PHP文件,增加字段类型: 'textgroups'=>'多文件上传', 打开phpcms\modules\content\fields\textgroups目录(第一步复制的文件夹),修改以下文件: form.inc.php function textgroups($f

1.4.2 solr字段类型--(1.4.2.1)字段类型定义和字段类型属性

1.4.2 solr字段类型 (1.4.2.1) 字段类型定义和字段类型属性. (1.4.2.2) solr附带的字段类型 (1.4.2.3) 使用货币和汇率 (1.4.2.4) 使用Dates(日期) (1.4.2.5) 使用枚举字段 (1.4.2.6) 使用外部文件和程序 (1.4.2.7) 字段属性使用案例 字段类型定义和字段类型属性 字段类型元素fieldType包含4个信息的类型:name,class-实现类的名称,analyzer-用于字段类型的分析,字段属性Field. schem