write down,forget

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:

    不客气,:)