ES 基本使用《四》--索引mapping

来源:互联网 发布:ftp服务使用的端口是 编辑:程序博客网 时间:2024/05/18 02:34

1. mapping

为了能够将时间域视为时间,数字域视为数字,字符串域视为全文或精确值字符串, Elasticsearch 需要知道每个域中数据的类型。这个信息包含在映射中。索引中每个文档都有 类型 。每种类型都有它自己的 映射 ,或者 模式定义映射定义了类型中的域,每个域的数据类型,以及Elasticsearch如何处理这些域。映射也用于配置与类型有关的元数据。

索引mapping:描述文档如何存储的。创建索引时指定,后续不可修改。有点像数据的数据类型的概念,

创建索引时,默认定义该索引的mapping;已经存在的映射是不能修改的,只能重新创建该搜索引。


Elasticsearch 支持 如下简单域类型:

  • 字符串: string
  • 整数 : byteshortintegerlong
  • 浮点数: floatdouble
  • 布尔型: boolean
  • 日期: date

当你索引一个包含新域的文档--之前未曾出现-- Elasticsearch 会使用 动态映射 ,通过JSON中基本数据类型,尝试猜测域类型,使用如下规则:

JSON type

域 type

布尔型: true 或者 false

boolean

整数: 123

long

浮点数: 123.45

double

字符串,有效日期: 2014-09-15

date

字符串: foo bar

string


2. 查看映射

  查看my_store类型为products的mapping

GET  /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.测试映射

可以使用 analyze API 测试字符串域的映射。比较下面两个请求的输出:

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