ES 基本使用《四》--索引mapping
2017-10-20 13:54
821 查看
1. mapping
为了能够将时间域视为时间,数字域视为数字,字符串域视为全文或精确值字符串, Elasticsearch 需要知道每个域中数据的类型。这个信息包含在映射中。索引中每个文档都有 类型 。每种类型都有它自己的 映射 ,或者 模式定义。映射定义了类型中的域,每个域的数据类型,以及Elasticsearch如何处理这些域。映射也用于配置与类型有关的元数据。
索引mapping:描述文档如何存储的。创建索引时指定,后续不可修改。有点像数据的数据类型的概念,
创建索引时,默认定义该索引的mapping;已经存在的映射是不能修改的,只能重新创建该搜索引。
Elasticsearch 支持 如下简单域类型:
字符串: string
整数 : byte, short, integer, long
浮点数: float, double
布尔型: boolean
日期: date
当你索引一个包含新域的文档--之前未曾出现-- Elasticsearch 会使用 动态映射 ,通过JSON中基本数据类型,尝试猜测域类型,使用如下规则:
2. 查看映射
查看my_store类型为products的mappingGET /my_store/_mapping/products (GET /my_store/products/_mapping/)
----------------------------------------------
{
"my_store": {
"mappings": {
"products": {
"properties": {
"price": {
"type": "long"
},
"productID": {
"type": "keyword"
}
}
}
}
}
}
3. 自定义映射
尽管在很多情况下基本域数据类型 已经够用,但你经常需要为单独域自定义映射 ,特别是字符串域。自定义映射允许你执行下面的操作:
全文字符串域和精确值字符串域的区别
使用特定语言分析器
优化域以适应部分匹配
指定自定义数据格式
还有更多
域最重要的属性是
{
"number_of_clicks": {
"type": "integer"
}
}
默认,
3.1 index
注意:其他简单类型(例如
因为它们永远不会被分析。
3.2 analyzer
对于
Elasticsearch 使用
`english`:
{
"tweet": {
"type": "string",
"analyzer": "english"
}
}
4. 更新映射
当你首次 创建一个索引的时候,可以指定类型的映射。你也可以使用
注意:尽管你可以 增加_
一个存在的映射,你不能 _修改 存在的域映射。如果一个域的映射已经存在,那么该域的数据可能已经被索引。如果你意图修改这个域的映射,索引的数据可能会出错,不能被正常的搜索
我们可以更新一个映射来添加一个新域,但不能将一个存在的域从
为了描述指定映射的两种方式,我们先删除
然后创建一个新索引,指定
PUT /gb
{
"mappings": { 通过消息体中指定的
"tweet" : {
"properties" : {
"tweet" : {
"type" : "string",
"analyzer": "english"
},
"date" : {
"type" : "date"
},
"name" : {
"type" : "string"
},
"user_id" : {
"type" : "long"
}
}
}
}
}稍后,我们决定在
PUT /gb/_mapping/tweet
{
"properties" : {
"tag" : {
"type" : "string",
"index": "not_analyzed"
}
}
}注意,我们不需要再次列出所有已存在的域,因为无论如何我们都无法改变它们。新域已经被合并到存在的映射中。
5.测试映射
可以使用
GET /gb/_analyze
{
"field": "tweet",
"text": "Black-cats"
}
tweet 是string类型使用index为analyzed 所以在填充数据和搜索数据是都要经过分析。
-----------------------
{
"tokens": [
{
"token": "black",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "cat",
"start_offset": 6,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 1
}
]
}
===============================================================
GET /gb/_analyze
{
"field": "tag",
"text": "Black-cats"
}
tag 域是string 但是index是not_analyzed不启用分析字符串功能。可以看到下面是一个完整的字符串
--------------------------------------
{
"tokens": [
{
"token": "Black-cats",
"start_offset": 0,
"end_offset": 10,
"type": "word",
"position": 0
}
]
}
总结:ES 索引的映射描述的是数据是如何存储的,很像关系型数据库中的字段数据类型。mapping都是在创建索引时通过自定义或者动态生成的,我们并不能更改已经存的mapping。其中简单的类型string值得我注意下,这个类型有两个属性,index (是否启用分析器)和
复杂核心类型:存储数据,多层级对象,多值,参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/complex-core-fields.html
为了能够将时间域视为时间,数字域视为数字,字符串域视为全文或精确值字符串, Elasticsearch 需要知道每个域中数据的类型。这个信息包含在映射中。索引中每个文档都有 类型 。每种类型都有它自己的 映射 ,或者 模式定义。映射定义了类型中的域,每个域的数据类型,以及Elasticsearch如何处理这些域。映射也用于配置与类型有关的元数据。
索引mapping:描述文档如何存储的。创建索引时指定,后续不可修改。有点像数据的数据类型的概念,
创建索引时,默认定义该索引的mapping;已经存在的映射是不能修改的,只能重新创建该搜索引。
Elasticsearch 支持 如下简单域类型:
字符串: string
整数 : byte, short, integer, long
浮点数: float, double
布尔型: boolean
日期: date
当你索引一个包含新域的文档--之前未曾出现-- Elasticsearch 会使用 动态映射 ,通过JSON中基本数据类型,尝试猜测域类型,使用如下规则:
JSON type | 域 type |
布尔型: true或者 false | boolean |
整数: 123 | long |
浮点数: 123.45 | double |
字符串,有效日期: 2014-09-15 | date |
字符串: foo bar | string |
查看my_store类型为products的mappingGET /my_store/_mapping/products (GET /my_store/products/_mapping/)
----------------------------------------------
{
"my_store": {
"mappings": {
"products": {
"properties": {
"price": {
"type": "long"
},
"productID": {
"type": "keyword"
}
}
}
}
}
}
3. 自定义映射
尽管在很多情况下基本域数据类型 已经够用,但你经常需要为单独域自定义映射 ,特别是字符串域。自定义映射允许你执行下面的操作:
全文字符串域和精确值字符串域的区别
使用特定语言分析器
优化域以适应部分匹配
指定自定义数据格式
还有更多
域最重要的属性是
type。对于不是
string的域,你一般只需要设置
type:
{
"number_of_clicks": {
"type": "integer"
}
}
默认,
string类型域会被认为包含全文。就是说,它们的值在索引前,会通过 一个分析器,针对于这个域的查询在搜索前也会经过一个分析器。
string域映射的两个最重要 属性是
index和
analyzer。
3.1 index
index属性控制怎样索引字符串。它可以是下面三个值:
analyzed首先分析字符串,然后索引它。换句话说,以全文索引这个域。
not_analyzed索引这个域,所以它能够被搜索,但索引的是精确值。不会对它进行分析。
no不索引这个域。这个域不会被搜索到。
string域
index属性默认是
analyzed。如果我们想映射这个字段为一个精确值,我们需要设置它为
not_analyzed:
{ "tag": { "type": "string", "index": "not_analyzed" } }
注意:其他简单类型(例如
long,
double,
date等)也接受
index参数,但有意义的值只有
no和
not_analyzed,
因为它们永远不会被分析。
3.2 analyzer
对于
analyzed字符串域,用
analyzer属性指定在搜索和索引时使用的分析器。默认,
Elasticsearch 使用
standard分析器, 但你可以指定一个内置的分析器替代它,例如
whitespace、
simple和
`english`:
{
"tweet": {
"type": "string",
"analyzer": "english"
}
}
4. 更新映射
当你首次 创建一个索引的时候,可以指定类型的映射。你也可以使用
/_mapping为新类型(或者为存在的类型更新映射)增加映射。
注意:尽管你可以 增加_
一个存在的映射,你不能 _修改 存在的域映射。如果一个域的映射已经存在,那么该域的数据可能已经被索引。如果你意图修改这个域的映射,索引的数据可能会出错,不能被正常的搜索
我们可以更新一个映射来添加一个新域,但不能将一个存在的域从
analyzed改为
not_analyzed。
为了描述指定映射的两种方式,我们先删除
gd索引:
DELETE /gb
然后创建一个新索引,指定
tweet域使用
english分析器:
PUT /gb
{
"mappings": { 通过消息体中指定的
mappings创建了索引
"tweet" : {
"properties" : {
"tweet" : {
"type" : "string",
"analyzer": "english"
},
"date" : {
"type" : "date"
},
"name" : {
"type" : "string"
},
"user_id" : {
"type" : "long"
}
}
}
}
}稍后,我们决定在
tweet映射增加一个新的名为
tag的
not_analyzed的文本域,使用
_mapping:
PUT /gb/_mapping/tweet
{
"properties" : {
"tag" : {
"type" : "string",
"index": "not_analyzed"
}
}
}注意,我们不需要再次列出所有已存在的域,因为无论如何我们都无法改变它们。新域已经被合并到存在的映射中。
5.测试映射
可以使用
analyzeAPI 测试字符串域的映射。比较下面两个请求的输出:
GET /gb/_analyze
{
"field": "tweet",
"text": "Black-cats"
}
tweet 是string类型使用index为analyzed 所以在填充数据和搜索数据是都要经过分析。
-----------------------
{
"tokens": [
{
"token": "black",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "cat",
"start_offset": 6,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 1
}
]
}
===============================================================
GET /gb/_analyze
{
"field": "tag",
"text": "Black-cats"
}
tag 域是string 但是index是not_analyzed不启用分析字符串功能。可以看到下面是一个完整的字符串
--------------------------------------
{
"tokens": [
{
"token": "Black-cats",
"start_offset": 0,
"end_offset": 10,
"type": "word",
"position": 0
}
]
}
总结:ES 索引的映射描述的是数据是如何存储的,很像关系型数据库中的字段数据类型。mapping都是在创建索引时通过自定义或者动态生成的,我们并不能更改已经存的mapping。其中简单的类型string值得我注意下,这个类型有两个属性,index (是否启用分析器)和
analyzer(指定分析器)。
启用分析器是,在该域填充数据喝着索引数据都会经过分析器。
复杂核心类型:存储数据,多层级对象,多值,参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/complex-core-fields.html
相关文章推荐
- es 基本语法 使用 案例
- ES 基本使用《二》--组合过滤
- es 基本语法 使用 案例
- ES 基本使用《一》--分析
- ES 基本使用《三》--terms
- mustache.js使用基本(二)sections
- python字典(dictionary)使用:基本函数code实例,字典的合并、排序、copy,函数中*args 和**kwargs做形参和实参
- WebView基本使用
- spring boot简介及基本使用
- Java基本数据类型、引用类对比及实际项目高级应用 使用==与equal的机制与不同
- java 8 时间新概念 java.time包基本使用
- Android中AlertDialog控件的基本使用和定制方法
- mongodb创建数据库和基本使用
- RxSwift基本使用(一)
- Bootstrap基本使用
- Android中第三方控件PhotoView的基本使用
- AFNetworking基本使用
- QTP的基本使用方法(六步)
- ansible基本使用
- Django的基本使用指令