Elasticsearch 搜索之路

【Elasticsearch 7 探索之路】(六)初识 Mapp

2019-12-25  本文已影响0人  隐峯

上一篇主要讲解什么是 URL Search 和 Request Body Search 的语法。本篇对 Mapping 的 Dynamic Mapping 以及手动创建 Mapping 进行讲解。

1.什么是 Mapping

2.常用字段的数据类型

3.1什么是 Dynamic Mapping

Dynamic Mapping 会自动根据文档信息,推算出字段的类型,使得你无需手动创建 Mapping。在写入文档时候,而且如果索引不存在,会自动创建索引。但是有时候推算也会错误,例如地理位置信息。当类型如果设置不对时,会导致一些功能无法正常运行,这点要特别注意。

下面总结 Json 类型到 Elasticsearch 类型的自动识别

3.2.Json 类型和 Elasticsearch 类型转换映射

Json 类型 Elasticsearch 类型
字符串 1.匹配日期格式,转为 Date
2.数值转为 float 或者 long,默认关闭
3.转为 Text,并且增加 keyword
布尔值 boolean
浮点数 float
整 数 long
对 象 Object
数 组 由第一个非空数值的类型所决定
空 值 忽略
PUT mapping_test/_doc/1
{
  "name":"al",
  "age":15,
  "ageStr":"15",
  "birth":"2019-12-18",
  "arg":["aaa","1"],
  "flag":false
}

GET mapping_test/_mapping
image

3.3.能否更改 Mapping 字段类型

PUT mapping_test/_mapping
{
    "dynamic":"false"
}

PUT mapping_test/_doc/2
{
  "name":"al",
  "age":15,
  "ageStr":"15",
  "birth":"2019-12-18",
  "arg":["aaa","1"],
  "flag":false,
  "addCol":"test"
}

GET mapping_test/_search
{
  "query": {
    "match": {
      "addCol": "test"
    }
  }
}

当前设置 "dynamic":"false"时,新增的字段查询不出结果。


image

4.1.手动创建 Mapping

上面我们介绍了关于 Dynamic Mapping 功能,现在但我们想要手动创建一个 Mapping 该如何创建。我先看一下下面代码。

PUT student
{
    "mappings":{
      "properties": {
        "firstName":{
          "type":"text"
        },
        "lastName":{
          "type":"text"
        },
        "password":{
          "type":"text",
          "index":false
        }
    }
    }
}

PUT student/_doc/1
{
  "firstName":"AA",
  "lastName":"BB",
  "password":"abc"
}

POST student/_search
{
  "query": {
    "match_phrase": {
      "password": {
        "query": "abc"
      }
    }
  }
}
image

上面这个例子,就是一个比较简单手动创建例子,我们通过为每一个字段创建类型,当指定 index:false 时,ES 将不对这个字段建立倒排索引,从上图结果就可以看出。

4.2.Index Options

ES 有四种不同级别的 Index Options 配置

Text 类型默认 positions,其他默认为 docs

4.3.copy_to

copy_to 是为瞒足一些特定搜素需求,将多个字段 数值拷贝到目标字段,目标字段不会出现在 _source。在 ES7 中,copy_to 已经替代 copy_to。例如下面这个例子,把 firsetName 和 lastName 合并一起搜素。

PUT student_1
{
    "mappings":{
      "properties": {
        "firstName":{
          "type":"text",
           "copy_to": "fullName"
        },
        "lastName":{
          "type":"text",
           "copy_to": "fullName"
        },
        "password":{
          "type":"text",
          "index":false
        }
    }
    }
}

PUT student_1/_doc/1
{
  "firstName":"AA",
  "lastName":"BB",
  "password":"abc"
}

Get student_1/_search?q=fullName:(AA BB)
image

5.小结

本篇主要对 Dynamic Mapping 以及手动创建 Mapping 进行讲解,Dynamic Mapping 有好处也有坏处,好处我们无需定义 Mapping,坏处是推算的类型不一定正确,这点要留意。如果手动创建 Mapping 比较推荐先用 Dynamic Mapping 创建生成一个临时索引,查询 Mapping 定义(标题3.2 下面的结果图)修改使用,这样可以减少工作量和出错的概率。

系列文章
【Elasticsearch 7 探索之路】(五)搜索相关 Search-API
【Elasticsearch 7 探索之路】(四)Analyzer 分析
【Elasticsearch 7 探索之路】(三)倒排索引
【Elasticsearch 7 探索之路】(二)文档的 CRUD 和批量操作
【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch?

上一篇下一篇

猜你喜欢

热点阅读