write down,forget
adidas eqt support ultra primeknit vintage white coming soon adidas eqt support ultra boost primeknit adidas eqt support ultra pk vintage white available now adidas eqt support ultra primeknit vintage white sz adidas eqt support ultra boost primeknit adidas eqt adv support primeknit adidas eqt support ultra boost turbo red white adidas eqt support ultra boost turbo red white adidas eqt support ultra boost turbo red adidas eqt support ultra whiteturbo adidas eqt support ultra boost off white more images adidas eqt support ultra boost white tactile green adidas eqt support ultra boost beige adidas eqt support ultra boost beige adidas eqt support refined camo drop adidas eqt support refined camo drop adidas eqt support refined running whitecamo adidas eqt support 93 primeknit og colorway ba7506 adidas eqt running support 93 adidas eqt support 93

Diving Into ElasticSearch(8)Mapping&Schema

<Category: Diving Into ElasticSearch> 查看评论

前面应该介绍过ES是Schema Free,但是Schema Free不是说没有Schema,和Solr一样,ElasticSearch也可以设置document的schema,ES里的名字叫Mapping,其实无非就是设置document包含哪些Field,然后对每一个Field个性化的设置索引类型,是否存储,以及设置索引分析器和查询使用的分析器,Es和Solr相比有一个我认为最好的特性:就是支持Object类型,你可以像操作对象一样对对象的某个属性进行索引和查询,简单演示如下:

A.首先创建一个索引文档,look,这个索引文档是一个复杂的json对象,weibo节点下面的author节点还有2个属性

B.我们试着查询一下,先简单查询下pubtime这个字段

看来,返回了查询正确的结果,那么如何通过weibo下面的属性进行查询呢,如下即可:

是不是很方便啊,其实ES在后面默默帮你做了很多事情,首先ES支持Dynamic Mapping,也就是可以预先不定义任何Mapping就可以使用,并且可以随时增加新的字段,可以随时修改字段的定义,change your mapping on the fly,贼灵活,在我们刚刚创建的那个索引的过程中,ES其实已经帮你悄悄的搞定了一个Mapping信息,我们先来瞅瞅

o,是不是有模有样啊,哈哈,这就是dynamic mapping的神奇之处,不过生产环境,还是需要手动配置一把的,动态的mapping多数情况下还是不能满足很变态的业务需求,不过已经很好了,后面我会提到mapping里面可以设置动态模板,索引级别也可以设置模板,总之一个字,酷。
另外对前面REST访问API的格式啰嗦几句,不知道前面有没有介绍,ElasticSearch是多租户的,访问(其他操作也一样)索引可以指定索引和类型,比如我们要查看某个索引下的某个类型的mapping信息,执行如下请求:

如果要查看类型weibo和类型weibo1的mapping信息,则在类型的部分输入多个类型,用“,”分割即可,如下:

另外,如果不指定类型则默认为该索引下所有类型,索引和类型一样,同样可以指定多个,用“,”分割,另外”_all”表示整个索引,

ps:其他地方操作索引和类型的api用法都一样,以此类推。另外索引全部都是小写,类型区分大小写,类型没有_all这种用法,大家可以试试。

ok,下面继续mapping,mapping分为如下几种类型,分别简单介绍下:
core :ES支持的所有核心的数据类型就这几种了:string, integer/long, float/double, boolean
array :支持数组数据类型

object :最开始说的就是这种类型,支持层次结构,对象嵌套,array等等,强大!
root object :就是object类型
nested :可以是嵌套的,前面说了
multi_field :多个字段是指对同一个字段的数据,可以通过设置不同的分析器来提供不同的字段来进行查询,如下,

ip :内置提供了ip这种特定数据类型的索引及查询
geo_point :内置地理位置这种数据格式,很不错哦
attachment :支持附件的索引,并使用tita来获取元数据信息

ElasticSearch的mapping很灵活,也很强大,你可以分开设置查询和索引的analyzer,也可以停用dynamic mapping,你还可以使用include_in_all来实现任意字段的查找,还可以设置routing,甚至还支持parent-child的关系查找,还有很多很不错的feature,自己去发掘吧。

详细的文档请访问这里:
http://www..org/guide/reference/mapping

本文来自: Diving Into ElasticSearch(8)Mapping&Schema


  1. 最近开始使用elasticsearch,于是找到了博主的博客。
    前来请教个问题:
    我有一个文档的索引,有个点击量的字段,是频繁更新的。按照lucene的特性,是没有办法只更新某个字段,而只能把包含hits的记录全部查询出来,改变hits数再更新回去。
    我想知道elasticsearch有没有什么好的办法解决这个问题。
    我是希望可以用hits数加上其他条件(term query)来做排序。

    medcl Reply:

    @darkyoung, 可以试试ES的Parent-Child特性,分两个索引来存,这样就可以分别更新,通过ParentID来做关联,可以到这里看看帮助:http://www.elasticsearch.org/guide/reference/mapping/parent-field.html

    darkyoung Reply:

    @medcl, 是的,目前我的解决方案就是hits作为parent。这样可以使用hits进行排序。然后用top_children来查询文档。

    谢谢回复!

    medcl Reply:

    不客气,:)