参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/mapping.html
映射简单理解为是数据定义,每种类型都有自己的映射,或者模式定义。

映射类型

  • 字符串: string
  • 整数 : byte, short, integer, long
  • 浮点数: float, double
  • 布尔型: boolean
  • 日期: date

<br />

查看映射

我们已经取得索引 gb 中类型 tweet 的映射:
GET /gb/_mapping/tweet

自定义映射

简单类型(例如 longdoubledate 等)也接受 index 参数,但有意义的值只有 nonot_analyzed , 因为它们永远不会被分析。

默认, string 类型域会被认为包含全文。就是说,它们的值在索引前,会通过一个分析器,针对于这个域的查询在搜索前也会经过一个分析器。
string 域映射的两个最重要属性是 indexanalyzer

index

index 属性控制怎样索引字符串。它可以是下面三个值:
analyzed首先分析字符串,然后索引它。换句话说,以全文索引这个域。not_analyzed 索引这个域,能够被搜索,但索引的是精确值。不会对它进行分析。
no不索引这个域。这个域不会被搜索到。
stringindex 属性默认是 analyzed 。如果我们想映射这个字段为一个精确值,我们需要设置它为 not_analyzed
{
“tag”: {
“type”: “string”,
“index”: “not_analyzed”
}
}

指定字符串既可以被全文索引也可以被搜索排序

被解析的字符串字段也是多值字段, 但是很少会按照你想要的方式进行排序。如果你想分析一个字符串,如 fine old art , 这包含 3 项。我们很可能想要按第一项的字母排序,然后按第二项的字母排序,诸如此类,但是 Elasticsearch 在排序过程中没有这样的信息。
为了以字符串字段进行排序,这个字段应仅包含一项: 整个 not_analyzed 字符串。 但是我们仍需要 analyzed 字段,这样才能以全文进行查询

但是保存相同的字符串两次在 _source 字段是浪费空间的。 我们真正想要做的是传递一个 单字段 但是却用两种方式索引它。所有的 _core_field 类型 (strings, numbers, Booleans, dates) 接收一个 fields 参数

  1. "tweet": {
  2. "type": "string",
  3. "analyzer": "english",
  4. "fields": {
  5. "raw": {
  6. "type": "string",
  7. "index": "not_analyzed"
  8. }
  9. }
  10. }
  11. tweet 主字段与之前的一样: 是一个 analyzed 全文字段。
  12. 新的 tweet.raw 子字段是 not_analyzed.
  13. 现在,至少只要我们重新索引了我们的数据,使用 tweet 字段用于搜索,tweet.raw 字段用于排序

更新映射

删除索引
DELETE /gb
创建索引

  1. PUT /gb
  2. {
  3. "mappings": {
  4. "tweet" : {
  5. "properties" : {
  6. "tweet" : {
  7. "type" : "string",
  8. "analyzer": "english"
  9. },
  10. "date" : {
  11. "type" : "date"
  12. },
  13. "name" : {
  14. "type" : "string"
  15. },
  16. "user_id" : {
  17. "type" : "long"
  18. }
  19. }
  20. }
  21. }
  22. }

定在 tweet 映射增加一个新的名为 tagnot_analyzed 的文本域,使用 _mapping
PUT /gb/_mapping/tweet
{
“properties” : {
“tag” : {
“type” : “string”,
“index”: “not_analyzed”
}
}
}