当前位置: 首页 > elasticsearch, 搜索 > 正文

ElasticSearch:Mapping&Schema

1 星2 星3 星4 星5 星 (1 次投票, 评分: 5.00, 总分: 5)
Loading ... Loading ...
baidu_share

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
curl -XPOST http://localhost:9200/index/weibo/1 -d'
{
    "weibo": {
       "pubtime":"2011-09-27",
        "id": "001",
        "content": "ElasticSearch是一个很不错的搜索引擎框架",
        "author": {
            "reg_time": "2011-09-27",
            "name": "medcl"
        }
    }
}
'

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

1
2
3
4
5
6
7
8
9
10
11
12
curl -XGET http://localhost:9200/index/weibo/_search?q=pubtime:2011-09-27
{"took":7,"timed_out":false,"_shards":{"total":3,"successful":3,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"index","_type":"weibo","_id":"1","_score":1.0, "_source" : {
    "weibo": {
       "pubtime":"2011-09-27",
        "id": "001",
        "content": "ElasticSearch是一个很不错的搜索引擎框架",
        "author": {
            "reg_time": "2011-09-27",
            "name": "medcl"
        }
    }
}}]}}

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

1
2
curl -XGET http://localhost:9200/index/weibo/_search?q=weibo.id:001
curl -XGET http://localhost:9200/index/weibo/_search?q=weibo.author.name:medcl

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
curl -XGET http://localhost:9200/index/weibo/_mapping
{
    "weibo": {
        "_source": {
            "compress": true
        },
        "properties": {
            "pubtime": {
                "format": "dateOptionalTime",
                "type": "date"
            },
            "id": {
                "type": "string"
            },
            "content": {
                "type": "string"
            },
            "author": {
                "dynamic": "true",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "reg_time": {
                        "format": "dateOptionalTime",
                        "type": "date"
                    }
                }
            }
        }
    }
}

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

http://localhost:9200/索引/类型/_mapping

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

http://localhost:9200/index/weibo,weibo1/_mapping

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

http://localhost:9200/index,index1/weibo,weibo1/_mapping

http://localhost:9200/_all/_mapping

http://localhost:9200/_mapping

ps:其他地方操作索引和类型的api用法都一样,以此类推。另外索引全部都是小写,类型区分大小写,类型没有_all这种用法,大家可以试试。
ok,下面继续mapping,mapping分为如下几种类型,分别简单介绍下:
core :ES支持的所有核心的数据类型就这几种了:string, integer/long, float/double, boolean
array :支持数组数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
curl -XPOST http://localhost:9200/index/type1 -d
'{
    "tweet" : {
        "message" : "some arrays in this tweet...",
        "tags" : ["elasticsearch", "wow"],
        "lists" : [
            {
                "name" : "prog_list",
                "description" : "programming list"
            },
            {
                "name" : "cool_list",
                "description" : "cool stuff list"
            }
        ]
    }
}'
curl -XGET http://localhost:9200/index/type1/_search?q=tweet.lists.name:prog_list
curl -XGET http://localhost:9200/index/type1/_search?q=tweet.lists.name:cool_list

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
curl -XPOST http://localhost:9200/index/tweet/_mapping -d'{
    "tweet" : {
        "properties" : {
            "name" : {
                "type" : "multi_field",
                "fields" : {
                    "name" : {"type" : "string", "index" : "analyzed"},
                    "untouched" : {"type" : "string", "index" : "not_analyzed"}
                }
            }
        }
    }
}'
 
curl -XPOST http://localhost:9200/index/tweet/1-d'{name:"beijing"}'
 
curl -XGET http://localhost:9200/index/tweet/_search?untouched=beijing
curl -XGET http://localhost:9200/index/tweet/_search?name=beijing

ip :内置提供了ip这种特定数据类型的索引及查询
geo_point :内置地理位置这种数据格式,很不错哦
attachment :支持附件的索引,并使用tita来获取元数据信息
ElasticSearch的mapping很灵活,也很强大,你可以分开设置查询和索引的analyzer,也可以停用dynamic mapping,你还可以使用include_in_all来实现任意字段的查找,还可以设置routing,甚至还支持parent-child的关系查找,还有很多很不错的feature,自己去发掘吧。
详细的文档请访问这里:

http://www.elasticsearch.org/guide/reference/mapping

本文固定链接: http://www.chepoo.com/elasticsearch-mapping-schema.html | IT技术精华网

ElasticSearch:Mapping&Schema:等您坐沙发呢!

发表评论