Elasticsearch搜索服务学习之十——索引映射管理

高新技术,ElasticSearch

2017-07-08

270

0

目录


 
映射可以理解为关系数据库的表结构,但是远比其强大。映射决定了索引如何定义其包含的文档、字段的结构,以及如何建立索引等。例如,我们可以定义:
  • 哪些字符串类型的字段需要作为全文本字段从而进行分词处理;
  • 哪些字段包含数字、日期类型和地理位置类型;
  • 所有字段的值是否全部建立索引存储到_all字段中;
  • 字段类型为日期的,我们定义其日期格式;
  • 自定义规则从而控制索引映射来动态添加字段

映射类型

(后边在详细学习)映射类型被用来将文档划分为不同的组,映射类型包括元字段和普通字段或属性:

元字段

源字段定义了如何处理文档的元数据,例如:  _index_type_id_source字段都是元字段。

字段或属性

映射定义了字段或属性的类型列表,相同映射中,处于不同映射类型的相同字段或属性必须具备 相同的映射
字段类型如下:
类型具体见官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

添加映射

curl -XPUT 'localhost:9200/test/' -d '{"mappings": {"data":{"properties":{"tags":{"type":"keyword","index":"not_analyzed"},"content":{"type":"text"}}}}}'
返回:
{"acknowledged":true,"shards_acknowledged":true}
上边创建了一个名为test的索引,并添加一个名为data的索引类型,该类型包含tags和content两个字段,分别为keword和text类型。
向存在的索引添加类型:
curl -XPUT 'localhost:9200/test/_mapping/user' -d '{"properties":{"name":{"type":"string"}}}'
多个索引设置映射
PUT http://127.0.0.1:9200/{index}/_mapping/{type}
{body}
  • {index}可以有多种方式,逗号分隔:比如test1,test2,test3。_all表示所有索引。通配符*表示所有。test*表示以test开头。
  • {type}需要添加或更新的文档类型。
  • {body}需要添加的字段或字段类型。
例如:
curl -XPUT 'localhost:9200/test,blog/_mapping/time' -d '{"properties":{"createTime":{"type":"date"},"updateTime":{"type":"date"}}}'
在test和blog两个索引中添加了新的映射类型time,并添加两个date类型的字段。

更新字段映射

映射创建过后,一般是不允许修改,例如更改映射类型:
curl -XPUT 'localhost:9200/test/_mapping/user' -d '{"properties":{"name":{"type":"date"}}}'
返回
{
    "error": {
        "root_cause": [
            {
                "type": "illegal_argument_exception",
                "reason": "mapper [name] of different type, current_type [text], merged_type [date]"
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "mapper [name] of different type, current_type [text], merged_type [date]"
    },
    "status": 400
}
会返回类型不同异常,有几种情况可以修改映射:
1、添加字段;
curl -XPUT 'localhost:9200/test/_mapping/user' -d '{"properties":{"age":{"type":"integer"}}}'
返回
{"acknowledged":true}
2、字段为JSON对象,添加新的字段
3、支持修改的参数信息,例如将字段设置为不分词(具体那些可以修改需要摸索学习):
curl -XPUT 'localhost:9200/test1/_mapping/testdata?pretty' -d '{"testdata":{"properties":{"test_id":{"type":"text", "index":"not_analyzed"}}}}'
原来是这样的:
curl -XPUT 'localhost:9200/test1?pretty' -d '{"mappings":{"testdata":{"properties":{"test_id":{"type":"text"}}}}}'

类型映射冲突

前边提到, 在elasticsearch,相同映射中,处于不同映射类型的相同字段或属性必须具备相同的映射。如果试图修改同名的某字段映射参数,会出现异常。
curl -XPUT 'localhost:9200/test2/?pretty' -d '{"mappings":{"testtype1":{"properties":{"test_id":{"type":"text", "analyzer":"standard"}}},"testtype2":{"properties":{"test_id":{"type":"text","analyzer":"standard"}}}}}'
 
尝试修改:
curl -XPUT 'localhost:9200/test2/_mapping/testtype2?pretty' -d '{"properties":{"test_id":{"type":"text", "analyzer":"standard", "search_analyzer": "whitespace"}}}'
 
结果如下
 
{
    "error": {
        "root_cause": [
            {
                "type": "illegal_argument_exception",
                "reason": "Mapper for [test_id] conflicts with existing mapping in other types:\n[mapper [test_id] is used by multiple types. Set update_all_types to true to update [search_analyzer] across all types., mapper [test_id] is used by multiple types. Set update_all_types to true to update [search_quote_analyzer] across all types.]"
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "Mapper for [test_id] conflicts with existing mapping in other types:\n[mapper [test_id] is used by multiple types. Set update_all_types to true to update [search_analyzer] across all types., mapper [test_id] is used by multiple types. Set update_all_types to true to update [search_quote_analyzer] across all types.]"
    },
    "status": 400
}
会出现映射不一致异常,此时需要添加update_all_types参数,修改相同过的所有类型。
curl -XPUT 'localhost:9200/test2/_mapping/testtype2?pretty&update_all_types' -d '{"properties":{"test_id":{"type":"text", "analyzer":"standard", "search_analyzer": "whitespace"}}}'
返回
{
"acknowledged" : true
}
查询映射,可以看到testtype1映射也被更新了:
curl -XGET 'localhost:9200/test2/_mapping?pretty'
结果如下
{
    "test2": {
        "mappings": {
            "testtype1": {
                "properties": {
                    "test_id": {
                        "type": "text",
                        "analyzer": "standard",
                        "search_analyzer": "whitespace"
                    }
                }
            },
            "testtype2": {
                "properties": {
                    "test_id": {
                        "type": "text",
                        "analyzer": "standard",
                        "search_analyzer": "whitespace"
                    }
                }
            }
        }
    }
}
 

获取映射

GET IP:PORT/{index}/_mapping/{type}
index、type可以使用通配符和逗号分隔,index使用_all表示搜索全部索引

获取索引

GET http://localhost:9200/test2/_mapping?pretty

获取类型映射

GET http://localhost:9200/test2/_mapping/testtype1?pretty

获取多个映射

curl -XGET 'localhost:9200/test,test2/_mapping?pretty'
curl -XGET 'localhost:9200/test,test2/_mapping/testtype1,data?pretty'

获取所有

curl -XGET 'localhost:9200/_all/_mapping?pretty'等价于curl -XGET 'localhost:9200/_mapping?pretty'
通配符
curl -XGET 'localhost:9200/test*/_mapping/test*?pretty'

获取字段映射

GET IP:PORT/{index}/_mapping/{type}/field/{field}
index、type、field可以使用通配符和逗号分隔,index使用_all表示搜索全部索引
curl -XGET 'localhost:9200/test2/_mapping/testtype1/field/test_id?pretty'

判断类型是否存在

HEAD IP:PORT/{index}/_mapping/{type}
存在返回200,否则返回404。
curl -IHEAD 'localhost:9200/test2/_mapping/testtype11?pretty'

前一篇:Elasticsearch搜索服务学习之九——索引管理
后一篇:Elasticsearch搜索服务学习之十一——数据建模(一)——关联关系

belonk

轻轻地我走了,正如我轻轻地来,我挥一挥衣袖,不带走一片云彩