1. 程式人生 > >Elasticsearch實戰系列-mapping 設定

Elasticsearch實戰系列-mapping 設定

本篇主要講解Mapping的一些相關配置與需要注意的地方,說到Mapping大家可能覺得有些不解,其實我大體上可以將Elasticsearch理解為一個RDBMS(關係型資料庫,比如MySQL),那麼index 就相當於資料庫例項,type可以理解為表,這樣mapping可以理解為表的結構和相關設定的資訊(當然mapping有更大範圍的意思)。

預設情況不需要顯式的定義mapping, 當新的type或者field引入時,Elasticsearch會自動建立並且註冊有合理的預設值的mapping(毫無效能壓力), 只有要覆蓋預設值時才必須要提供mapping定義。

什麼是Mapping

先看看官方文件中的定義

A mapping defines the fields within a type, the datatype for each field, and how the field should be handled by Elasticsearch. A mapping is also used to configure metadata associated with the type.

Mapping定義了type中的諸多欄位的資料型別以及這些欄位如何被Elasticsearch處理,比如一個欄位是否可以查詢以及如何分詞等。

自定義Mapping

下面是一個簡單的Mapping定義:

curl -XPUT 'http://localhost:9200/megacorp' -d '
{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 1
    }, 
    "mappings": {
        "employee": {
            "properties": {
                "first_name": {
                    "type": "string"
                }, 
                "
last_name": { "type": "string" }, "age": { "type": "integer" }, "about": { "type": "string" }, "interests": { "type": "string" }, "join_time": { "type": "date", "format": "dateOptionalTime", "index": "not_analyzed" } } } } } '

其中employee是type(相當於關係資料庫中的表),在employee中我們定義了first_name、last_name、age、about、interests、join_time這6個屬性。

{ "interests": { "type": "string"}

type表示field的資料型別,上例中interests的type為string表示為普通文字。
Elasticsearch支援以下資料型別:

  • 文字: string
  • 數字: byte, short, integer, long
  • 浮點數: float, double
  • 布林值: boolean
  • Date: date

對於type為 string 的欄位,最重要的屬性是:index and analyzer。
1、index
index 屬性控制string如何被索引,它有三個可選值:

  • analyzed: First analyze the string, then index it. In other words,
    index this field as full text.
  • not_analyzed:: Index this field, so it is searchable, but index the
    value exactly as specified. Do not analyze it.
  • no: Don’t index this field at all. This field will not be
    searchable.

對於string型別的filed index 預設值是: analyzed.如果我們想對進行精確查詢, 那麼我們需要將它設定為: not_analyzed。
例如:

{ "tag": { "type": "string", "index": "not_analyzed" }

2、analyzer
對於 string型別的欄位, 我們可以使用 analyzer 屬性來指定在搜尋階段和索引階段使用哪個分詞器. 預設, Elasticsearch 使用 standard analyzer, 你也可以指定Elasticsearch內建的其它分詞器,比如 whitespace, simple, or english:

例如:

{ "tweet": { "type": "string", "analyzer": "english" }