关于java:Elasticsearch-mapping

53次阅读

共计 5194 个字符,预计需要花费 13 分钟才能阅读完成。

Elasticsearch mapping

本篇次要介绍一下 Elasticsearch mapping 的概念, 它是什么 以及如何自定义它, 并且再介绍一下 dynamic 的机制

如果把 Elasticsearch 中的 mapping 比照到 mysql 中 就是 mysql 中的 表的 scheme , 就是表的定义构造,

失常在 关系型数据库 mysql 中 须要先把表的 scheme 定义好 再插入数据, 并且 你无奈插入未在 scheme 中定义的字段 , 而 es 中 能够在你未给索引定义 mapping 的时候 主动帮你创立 mapping , 并且你也能够通过 dynamic 来管制是否容许灵便动静的 增加 mapping 中的属性

1. 什么是 Mapping

  • Mapping 相似 mysql 中的 schema 的定义, 就是定义索引属性字段的

    • 定义索引中字段的名称
    • 定义索引中字段的数据类型 , 如 text , long , keyword….
    • 定义索引中字段的的倒排索引相干配置 (Analyzer…)
  • 一个 Mapping 属于一个索引的 Type

    • 每个文档都属于一个 Type
    • 一个 Type 有一个 Mapping 定义
    • es7.0 开始, 在 Mapping 中不须要指定 Type 信息, 因为 7.0 之后只有_doc Type

2.es 主动创立 mapping

当咱们去创立一个 索引的时候 未指定 mapping , es 会默认帮这个索引创立一个 mapping

创立一个 索引并且索引一条数据

PUT blog/_doc/1
{
  "name": "es mapping",
  "type": "es",
  "desc": "es mapping desc",
  "author": "johnny",
  "word_count": 50,
  "create_time": "2022-10-31"
}
GET blog/_mapping  # 查看一个 es 主动生成的 mapping

从下面能够看进去 属性都被 es 主动创立了 对应的 mapping , 包含每个属性的 type 类型等, 那它为什么会这样转化的, 什么时候是 text, 什么时候是 long 上面就来介绍 es 中 mapping 的 类型自动识别

3. mapping 类型自动识别

JSON 类型 Elasticsearch 类型
字符串 1. 匹配日期格局 会设置成 Date
2. 匹配数字 设置成 float 或者 long , 该选项默认敞开的
3. 设置成 Text , 并且增加 keyword 子字段
整数 long
浮点数 float
布尔值 boolean
对象 object
数组 由第一个非空数值的类型所定义 . 如 [“jack”,”johnny”] 则类型为 Text
空值 疏忽 ???
我试验的版本里 7.18 , 如果设置 null 会被主动定义为 Text , 具体不太分明

4. 自定义创立 mapping

除了下面的介绍的 es 主动创立 mapping 外, 还能够自定义 索引的 mapping , 更加灵便和合乎业务需要等等.

留神以前的版本须要在 mappings 上面还有一层 type , 如 mappings: {“_doc” : { “properties” : {xxx} }} 然而 7.0 之后 type 就不须要了

PUT blog_info
{
  "mappings": {
      "properties": {
        "blog_name": {"type": "keyword"},
        "blog_desc": {"type": "text"},
        "blog_word_count": {"type": "long"},
        "create_time": {"type": "date"}
      }
    }
}

其中 text 和 keyword 类型,text 类型的字段在新增或批改文档时会主动分词, 而 keyword 不会, 它会保留插入的原始文本

索引一条数据

PUT blog_info/_doc/1
{
  "blog_name": "es mapping",
  "blog_desc": "es mapping desc",
  "blog_word_count": 12,
  "blog_auther": "johnny",
  "create_time": "2022-10-31"
}

5. mapping 属性设置 analyzer 分词器

默认分词器 standard , 它会把中文一个个拆开, 必定是不适宜的, 如果是索引中文的信息, 须要设置字段的分词器,

PUT blog_info
{
  "mappings": {
      "properties": {
        "blog_desc": {
          "type": "text",
          "analyzer": "ik_smart" // 设置这个字段的分词器 
        }
      }
    }
}

大部分分词器是须要以 es 中插件的形式 装置的 , 后续会出一篇专门的 analyzer 分词器

6. mapping 属性设置 boost 权重

在 es 搜寻的时候 会有一个相关性算分的过程 , 如果不设置 每个字段的默认 boost 权重为 1.0 , 如果心愿加大 依照广告投放金额的分 那么能够设置 boost 以进步搜寻 天然就排在后面了

PUT blog_info
{
  "mappings": {
      "properties": {
        "put_amount": {
          "type": "text",
          "boost": "5" 
        }
      }
    }
}

7. mapping 属性设置 copy_to

该属性容许多个字段 copy 到指定的字段, 能够进行搜寻这个字段, 然而_source 中是不显示的

PUT peope
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text",
        "copy_to": "full_name"
      },
      "last_name":{
        "type": "text",
        "copy_to": "full_name" // copy_to 指定字段
      },
      "full_name":{"type": "text"}
    }
  }
}
GET peope/_search?q=full_name:johnny  // 应用 full_name 去搜寻

// 能够看到 并没有 full_name 的返回 然而能够通过它去搜寻
"_source" : {
   "first_name" : "johnny",
   "last_name" : "qiang"
}

8. mapping 属性设置 index

通过给 属性设置 index 来管制该 字段是否 参加 索引, 默认 true , 如果 index 设置为 false 那么 不能记录索引 并且不能够搜寻

PUT peope
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text",
        "index": false // 设置 index false
      },
      "last_name":{"type": "text"}
    }
  }
}

POST peope/_doc
{
  "first_name": "johnny is good name",
  "last_name": "qiang"
}

留神 url-search 搜不到然而不报错, 而 requestbody 查问 index false 的字段 会报错

GET peope/_search?q=first_name:johnny // 搜寻不到数据 因为 

//"hits" : [ ] 

GET peope/_search?q=last_name:johnny // 能够看到因为 last_name 默认 index 了 所以能够搜寻到

//
//    "hits" : [
//      {
//        "_index" : "peope",
//        "_type" : "_doc",
//        "_id" : "vobiMYQB4x9Wk60f2F21",
//        "_score" : 0.2876821,
//        "_source" : {
//          "first_name" : "johnny is good name",
//          "last_name" : "johnny is good name"
//        }
//      }
//    ]

GET peope/_search
{
  "query": {
    "match": {"first_name": "johnny"}
  }
}
// 抛错 400 Cannot search on field [first_name] since it is not indexed.

9. mapping 设置 属性 null_value 默认值

null_value: 当字段遇到 null 值时候的解决策略(字段为 null 时候是不能被搜寻的, 也就是说,text 类型的字段不能应用该属性, 能够应用在 keyword 字段上),设置该值后能够用你设置的值替换 null 值,这点可类比 mysql 中的 ”default” 设置默认值, 然而也有点不一样, 后续就能够应用你设置的这个 null_value 去搜寻, 然而检索进去的数据_source 中 还是展现 null

PUT peope
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "keyword",
        "null_value": "default" // 设置当 文档的 first_name 字段为 null 时候 转成 default 去创立倒排索引
      },
      "last_name":{"type": "text"}
    }
  }
}

POST peope/_doc
{
  "first_name": null, // 设置 null 值
  "last_name": "johnny is good name",
  "full_name": "johnny is good name"
}

GET peope/_search?q=first_name:default // 依据 null_value 设置的值去搜寻, 查问进去还是原来的 null

// {
//        "_index" : "peope",
//        "_type" : "_doc",
//        "_id" : "xob-MYQB4x9Wk60fVF1_",
//        "_score" : 0.2876821,
//        "_source" : {
//          "first_name" : null,  
//          "last_name" : "johnny is good name",
//          "full_name" : "johnny is good name"
//        }
// }

10. mapping 设置 dynamic

dynamic 是否容许动静新增字段

  • true : 容许动静新增字段 同时 mapping 被更新 文档可被索引
  • false: 不容许动静新增字段 , mapping 不会被更新, 字段不能被索引, 然而数据能够入库并且信息会呈现在 _source 中
  • strict : 不容许写入, 间接报错

对于曾经存在的字段 一旦又数据写入, 就不能进行批改字段定义了, 因为 底层 Lucene 不容许批改, 如果心愿批改字段类型, 必须 reindex 重建索引

10.1 dynamic false
PUT peope
{
  "mappings": {
    "dynamic": false, // 设置在索引上的 而不是对应的字段上的 
    "properties": {
      "first_name": {"type": "text"},
      "last_name":{"type": "text"}
    }
  }
}

POST peope/_doc //dynamic false 能够入库文档数据
{
  "first_name": "johnny is good name",
  "last_name": "johnny is good name",
  "full_name": "johnny is good name"
}


GET peope/_search?q=full_name:johnny // 尝试通过 新增的字段去搜寻
// "hits" : [ ]

GET peope/_search?q=first_name:johnny // 能够搜到数据, 并且_source 中能够看到新增的字段
//
//    "hits" : [
//      {
//        "_index" : "peope",
//        "_type" : "_doc",
//        "_id" : "vobiMYQB4x9Wk60f2F21",
//        "_score" : 0.2876821,
//        "_source" : {
//          "first_name" : "johnny is good name",
//          "last_name" : "johnny is good name",
//          "full_name" : "johnny is good name" 
//        }
//      }
//    ]
10.2 dynamic strict

strict : 严格模式 , 不容许 动静新增字段的

PUT peope
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "first_name": {"type": "text"},
      "last_name":{"type": "text"}
    }
  }
}
POST peope/_doc // 间接抛错
{
  "first_name": "johnny is good name",
  "last_name": "johnny is good name",
  "full_name": "johnny is good name"
}
// 400 mapping set to strict, dynamic introduction of [full_name] within [_doc] is not allowed

总结

本篇十分具体介绍了 Elasticsearch 中 mapping , 介绍了 mapping 它是什么, 主动创立 mapping 的机制 , 自定义 mapping 中各种参数设置. 一起来学习坚固吧.

欢送大家拜访 集体博客 Johnny 小屋
欢送关注集体公众号

正文完
 0