ES Mapping設(shè)置及常見(jiàn)參數(shù)設(shè)置

1. mapping

類似于數(shù)據(jù)庫(kù)的schema的定義,mapping會(huì)把文檔映射成lucene需要的扁平格式,一個(gè)mapping屬于一個(gè)索引的type,一個(gè)type中有一個(gè)mapping定義,7.0后一個(gè)索引只有一個(gè)type,所以不需要在mapping中定義type的信息。作用如下:

  • 定義索引這里面的字段和名稱
  • 定義字段的數(shù)據(jù)類型,字符串、布爾、數(shù)字......
  • 字段,倒排索引相關(guān)的配置,是否分詞。

1.1 字段的類型

  • 簡(jiǎn)單類型
    text/keyword,Date,Integer/Floating,Boolean,IPv4 &IPv6
  • 復(fù)雜類型
    對(duì)象類型/嵌套類型
  • 特殊類型
    geo_point & geo_shape/percolator(地理信息)
  • 數(shù)組類型
    ES不提供專門的數(shù)組類型,任何字段都可以包含多個(gè)相同類型的數(shù)值

2.Dynamic Mapping

寫入文檔的時(shí)候,索引不存在,會(huì)自動(dòng)創(chuàng)建索引, 無(wú)需手動(dòng)創(chuàng)建,ES會(huì)根據(jù)內(nèi)容推斷字段的類型,推斷會(huì)不準(zhǔn)確,可能造成某些功能無(wú)法使用,例如 范圍查詢。

查看一個(gè)索引當(dāng)前的mapping

GET /movies/_mapping

{
  "movies" : {
    "mappings" : {
      "properties" : {
        "@version" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "genre" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "id" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "year" : {
          "type" : "long"
        }
      }
    }
  }
}

類型的自動(dòng)識(shí)別關(guān)系:

JSON類型 Elasticsearch
字符串 匹配日期格式,設(shè)置為date;匹配數(shù)字,設(shè)置為float或者long,功能默認(rèn)關(guān)閉;設(shè)置為text,并增加keyword子字段。
布爾值 boolean
浮點(diǎn)數(shù) float
整數(shù) long
對(duì)象 object
數(shù)組 由第一個(gè)非空數(shù)值的類型決定
空值 忽略

測(cè)試

PUT mapping_test/_doc/1
{
  "uid":1,
  "is_vip":false,
  "user_name":"wang",
  "info":{
    "address":"地址信息",
    "card":"picture.png"
  }
}

獲取查看信息 GET /mapping_test/_mapping

{
  "mapping_test" : {
    "mappings" : {
      "properties" : {
        "info" : {
          "properties" : {
            "address" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "card" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "is_vip" : {
          "type" : "boolean"
        },
        "uid" : {
          "type" : "long"
        },
        "user_name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

3.修改Mapping的字段類型

  • 新增字段
    • dynamic設(shè)置為true,一旦有新增字段的文檔寫入,mapping也同時(shí)被更新。
    • dynamic設(shè)置為false,mapping不會(huì)被更新,新增的字段數(shù)據(jù)無(wú)法被索引,但是信息會(huì)出現(xiàn)在source中.
    • dynamic設(shè)置為strict,文檔寫入失敗
  • 已有的字段,一旦有數(shù)據(jù)寫入,不支持修改(倒排索引不支持修改)
  • 希望更改字段類型,用Reindex API,重建索引
    設(shè)計(jì)原因
  • 如果修改字段數(shù)據(jù)類型,會(huì)導(dǎo)致已經(jīng)被索引的文檔不能被搜索。
  • 新增字段不存在影響。
POST mapping_test2/_doc
{
  "field":"one"
}
GET mapping_test2/_search
{
  "query": {
    "match": {
      "field": "one"
    }
  }
}
PUT mapping_test2/_mapping
{
  "dynamic":"false"
}
POST mapping_test2/_doc
{
  "field_2":"two"
}
//
GET mapping_test2/_search
{
  "query": {
    "match": {
      "field_2": "two"
    }
  }
}
//但是可以查出來(lái)
GET mapping_test2/_search
POST mapping_test2/_doc
{
  "field_2":"three",
  "field":"3"
}
//但是根據(jù)field字段可以查出來(lái)
GET mapping_test2/_search
{
  "query": {
    "match": {
      "field": "3"
    }
  }
}

4. 顯示的設(shè)置mapping信息

顯示的設(shè)置mapping可以更靈活控制ES。

根據(jù)API手冊(cè),手寫,減少出錯(cuò)概率的方法。

  • 創(chuàng)建一個(gè)臨時(shí)的index,寫入一些樣本數(shù)據(jù)
  • 通過(guò)mapping api獲得該臨時(shí)文件的動(dòng)態(tài)mapping定義
  • 修改后用,使用該配置創(chuàng)建索引
  • 刪除臨時(shí)索引

4.1 控制字段是否被index

index的選項(xiàng)配置

  • docs:記錄doc id
  • freqs:記錄doc id和term的頻次
  • position: 記錄doc id、term頻次、term位置
  • offsets:doc id、term頻次、term位置、字符串的偏移量

text類型默認(rèn)是positions,其他的默認(rèn)為docs,記錄內(nèi)容越多,占據(jù)空間越大

例如創(chuàng)建mapping,字段名為user_name,字符串類型。不需要索引,info字段的倒排索引類型為positions。

PUT mapping_test3
{
  "mappings": {
    "properties": {
      "user_name":{
        "index": false,
        "type": "text"
      },
      "info":{
        "index_options": "positions",
        "type": "text"
      }
    }
  }
}

4.2 null_value

對(duì)Null值進(jìn)行搜索,可以通過(guò)keyword類型的字段設(shè)置null_value。

"mobile":{
     "type":"keyword",
      "null_value":"NULL"
 }

就可以對(duì)NULL搜索:GET users/_search?q=mobile:NULL

4.3 copy_to

  • 用來(lái)滿足一些搜索需要,類似于數(shù)據(jù)庫(kù) title like "%a%" or title2 like "%a%"
  • copy_to的字段不會(huì)出現(xiàn)在_source里面
PUT users
{
  "mappings": {
    "properties": {
      "first_name":{
        "type": "text",
        "copy_to": "full_name"
      },
      "last_name":{
        "type": "text",
        "copy_to": "full_name"
      }
    }
  }
}

就可以在支持 :GET users/_search?q=full_name:(zhang san)搜索。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容