1. 程式人生 > >ElasticSearch學習筆記六 對映元欄位( Mapping Meta-Fields)

ElasticSearch學習筆記六 對映元欄位( Mapping Meta-Fields)

Meta-Fields

每個文件都有與之關聯的元欄位,例如_index、_type和 _id 元欄位。 元欄位是mapping對映中用啦描述文件本身資訊的欄位。

Identity meta-fields(文件標示元欄位)

_index

文件所屬的索引。

多索引查詢時,有時候只需要在特地索引名上進行查詢,_index欄位提供了便利,也就是說可以對索引名進行term查詢、terms查詢、聚合分析、使用指令碼和排序。

_index是一個虛擬欄位,不會真的加到Lucene索引中,對_index進行term、terms查詢(也包括match、query_string、simple_query_string),但是不支援prefix、wildcard、regexp和fuzzy查詢。

_uid

_type 和_id 的組合

在elasticsearch6及之後棄用。現在,_type型別已被刪除,文件由_id唯一標識,_uid欄位僅作為檢視_id欄位以保持向後相容。

_type

文件的匹配型別。

在elasticsearch6及之後棄用。
索引中的每一份文件都和一個 _type和_id唯一關聯。 _type 欄位本身的設計目標是為了索引更快查詢。可被查詢,聚合,排序使用,或者腳本里使用。

_id

文件的id.

每一個文件都有一個獨一無二的 _id 標示它, 它被索引儲存一遍我們在呼叫GET API 或者查詢ids時能夠更快的點位文件。

在elasticsearch6之前因為支援多型別的存在,所以我們在一個索引中唯一標示文件需要同時用到 _type 和 _id,或者用_uid來作為唯一主鍵,elasticsearch6 及之後_id 就是索引的唯一主鍵。

Document source meta-fields(原文件元欄位)

_source

文件的原生json字串文件內容。

_source欄位包含在索引時間傳遞的原始JSON文件正文。 _source欄位本身沒有編入索引(因此不可搜尋),但它被儲存,以便在執行獲取請求(如get或search)時可以返回它。
預設_source欄位是開啟的,也就是說,預設情況下儲存文件的原始值。

禁用_source

如果某個欄位內容非常多(比如一篇小說),或者查詢業務只需要對該欄位進行搜尋,返回文件id,然後通過其他途徑檢視文件原文,則不需要保留_source元欄位。可以通過禁用_source元欄位,在ElasticSearch 中只儲存倒排索引,不保留欄位原始值。

PUT tweets
{
  "mappings": {
    "_doc": {
      "_source": {
        "enabled": false
      }
    }
  }
}

包含或者去除 _source 元欄位裡面的欄位

在文件儲存之前,我們可以先定義在索引_source儲存哪些資訊不儲存哪些資訊
定義對映

PUT logs
{
  "mappings": {
    "_doc": {
      "_source": {
        "includes": [
          "*.count",
          "meta.*"
        ],
        "excludes": [
          "meta.description",
          "meta.other.*"
        ]
      }
    }
  }
}

插入內容

PUT logs/_doc/1
{
  "requests": {
    "count": 10,
    "foo": "bar" 
  },
  "meta": {
    "name": "Some metric",
    "description": "Some metric description", 
    "other": {
      "foo": "one", 
      "baz": "two" 
    }
  }
}
GET logs/_search
{
  "query": {
    "match": {
      "meta.other.foo": "one" 
    }
  }
}

查詢結果如下:

{
  "took": 58,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "logs",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "meta": {
            "other": {},
            "name": "Some metric"
          },
          "requests": {
            "count": 10
          }
        }
      }
    ]
  }
}

_size

mapper-size 外掛提供的計算整個_source欄位的位元組數大小 。

Indexing meta-fields(索引元欄位)

_all

_all欄位是把其它欄位拼接在一起的超級欄位,所有的欄位用空格分開,_all欄位會被解析和索引,但是不儲存。當你只想返回包含某個關鍵字的文件但是不明確地搜某個欄位的時候就需要使用_all欄位。預設是關閉的。

在elasticsearch6及之後棄用。

PUT /my_index
{
  "mapping": {
    "user": {
      "_all": {
        "enabled": true   
      }
    }
  }
}

PUT /my_index/user/1      
{
  "first_name":    "John",
  "last_name":     "Smith",
  "date_of_birth": "1970-10-24"
}

GET /my_index/_search
{
  "query": {
    "match": {
      "_all": "john smith 1970"
    }
  }
}

上面的例子中_all 將包含這些索引詞: [ "john", "smith", "1970", "10", "24" ],索引次的組合順序依賴於分詞器,_all已棄用。

_field_names

_field_names欄位包含索引文件中欄位的取值除null以外的任何值每個欄位的名稱。 一般使用此欄位來查詢對於特定欄位具有或不具有任何非空值的文件。

目前,一般來講_field_names欄位只包含具有doc_values並且預設關閉屬性的欄位名稱。

禁用 _field_names

PUT tweets
{
  "mappings": {
    "_doc": {
      "_field_names": {
        "enabled": false
      }
    }
  }
}

_ignored

elasticsearch 6.4之後新增元欄位

_ignored 元欄位索引和儲存文件中由於ignore_malformed屬性被ignored 的每個欄位的名稱。

Routing meta-field(路由元欄位)

_routing

索引中的文件儲存在特定的分片使用下面的公式決定:

shard_num = hash(_routing) % num_primary_shards

預設是用的 文件_id元欄位的值來路由。

自定義路由模式可以通過指定每個文件的自定義路由值來實現。例如:

PUT my_index/_doc/1?routing=user1&refresh=true 
{
  "title": "This is a document"
}
GET my_index/_doc/1?routing=user1 

查詢結果

{
  "_index": "my_index",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "_routing": "user1",
  "found": true,
  "_source": {
    "title": "This is a document"
  }
}

請求體查詢方式如下:

GET my_index/_search
{
  "query": {
    "terms": {
      "_routing": [ "user1" ] 
    }
  }
}

meta-field (自定義元欄位)

elasticsearch 也支援自定義元資料。