1. 程式人生 > >ElasticSearch學習筆記之七 對映引數(Mapping parameters)

ElasticSearch學習筆記之七 對映引數(Mapping parameters)

對映引數(Mapping parameters)

analyzer

可分析的欄位的取值會被分析器經過Token過濾和字元過濾轉換為一系列的索引詞,舉例來說, 字串 “The quick Brown Foxes.” 依賴於所使用的分析器可以過濾分詞為: quick, brown, fox. 它們會作為精確詞被索引,這也使得在一段全文中檢索這些關鍵字成為可能。

分析的過程不僅發生在索引的時候,在我們搜尋的時候同樣需要: 被檢索的字串需要經過同樣的分析器分析,這樣以來我們才可以在索引中檢索同樣被分析的全文。

Elasticsearch 預設了一系列的分析器,如果我們沒有特別指定,Elasticsearch 會直接使用的預包裝的分析器。

我們可以為每個索引、每次查詢、每個欄位指定分析器。Elasticsearch 按以下順序查詢分析器:

  • 欄位對映中定義的分析器
  • 索引設定的預設分析器
  • Elasticsearch 標準分析器

搜尋的時候按以下順序查詢分析器:

  • 全文檢索定義的分析器
  • 屬性對映中定義的搜尋_analyzer
  • 屬性對映中定義中分析器
  • 索引設定中設定的名為default_search 的分析器
  • 索引設定中設定的名為default的分析器
  • 標準分析器

最簡單的方法為特定欄位指定分析器實在它的對映中定義,例如:

PUT /my_index
{
  "mappings": {
    "_doc": {
      "properties"
: { "text": { "type": "text", //使用預設標準分析器 "fields": { "english": { //指明english分析器 "type": "text", "analyzer": "english" } } } } } } }

檢視分詞器

GET my_index/_analyze 
{
  "field": "text",
  "text"
: "The quick Brown Foxes." }

分析結果如下

{
  "tokens": [
    {
      "token": "the",
      "start_offset": 0,
      "end_offset": 3,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "quick",
      "start_offset": 4,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "brown",
      "start_offset": 10,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "foxes",
      "start_offset": 16,
      "end_offset": 21,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

我們得到的精確詞是[ the, quick, brown, foxes ] 接下來看看english分析器

GET my_index/_analyze 
{
  "field": "text.english",
  "text": "The quick Brown Foxes."
}

結果如下

{
  "tokens": [
    {
      "token": "quick",
      "start_offset": 4,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "brown",
      "start_offset": 10,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "fox",
      "start_offset": 16,
      "end_offset": 21,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

得到的精確詞是[ quick, brown, fox ]

normalizer

對於keyword型別的欄位來說除了只會分析產生一個精確詞以外normalizer 相當於analyzed。

normalizer 用在索引儲存或者查詢一個keyword型別的欄位之前標準化配置,比如把所有的字元轉化為小寫等。 配置索引

PUT index
{
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "char_filter": [],
          "filter": ["lowercase", "asciifolding"]
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "foo": {
          "type": "keyword",
          "normalizer": "my_normalizer"
        }
      }
    }
  }
}

儲存文件

PUT index/_doc/1
{
  "foo": "BÀR"
}

PUT index/_doc/2
{
  "foo": "bar"
}

PUT index/_doc/3
{
  "foo": "baz"
}
POST index/_refresh

精確詞查詢

GET index/_search
{
  "query": {
    "term": {
      "foo": "BAR"
    }
  }
}

結果如下

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "index",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.2876821,
        "_source": {
          "foo": "bar"
        }
      },
      {
        "_index": "index",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "foo": "BÀR"
        }
      }
    ]
  }
}

匹配查詢

GET index/_search
{
  "query": {
    "match": {
      "foo": "BAR"
    }
  }
}

結果如下

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "index",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.2876821,
        "_source": {
          "foo": "bar"
        }
      },
      {
        "_index": "index",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "foo": "BÀR"
        }
      }
    ]
  }
}

同理,聚合查詢的也會是標準化處理的欄位 聚合查詢

GET index/_search
{
  "size": 0,
  "aggs": {
    "foo_terms": {
      "terms": {
        "field": "foo"
      }
    }
  }
}

結果如下:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "foo_terms": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "bar",
          "doc_count": 2
        },
        {
          "key": "baz",
          "doc_count": 1
        }
      ]
    }
  }
}

boost

我們可以通過指定一個boost值來控制每個查詢子句的相對權重,該值預設為1。一個大於1的boost會增加該查詢子句的相對權重。

索引對映定義的時候指定boost在elasticsearch5之後已經棄用。建議在查詢的時候使用。

POST _search
{
    "query": {
        "match" : {
            "title": {
                "query": "quick brown fox",
                "boost": 2
            }
        }
    }
}

coerce

資料不總是我們想要的,由於在轉換JSON body為真正JSON 的時候,整型數字5有可能會被寫成字串"5"或者浮點數5.0。 coerce屬性可以用來清除髒資料。

例如:

  • 字串會被強制轉換為整數
  • 浮點數被強制轉換為整數

舉個例子: 定義索引對映

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "number_one": {
          "type": "integer"
        },
        "number_two": {
          "type": "integer",
          "coerce": false
        }
      }
    }
  }
}

插入資料

PUT my_index/_doc/1
{
  "number_one": "10" 
}

插入結果:

{
  "_index": "my_index",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

number_one會插入整數10。

插入number_two資料

PUT my_index/_doc/2
{
  "number_two": "10" 
}

插入結果:

{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "failed to parse [number_two]"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "failed to parse [number_two]",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "Integer value passed as String"
    }
  },
  "status": 400
}

由於不能格式化,文件被拒絕。

copy_to

copy_to允許你創造自定義超級欄位_all. 換句話來說就是,多欄位的取值被複制到一個欄位並且取值所有欄位的取值組合, 並且可以當成一個單獨的欄位查詢. 如,first_name和last_name可以合併為full_name欄位。 索引對映定義

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "first_name": {
          "type": "text",
          "copy_to": "full_name" 
        },
        "last_name": {
          "type": "text",
          "copy_to": "full_name" 
        },
        "full_name": {
          "type": "text"
        }
      }
    }
  }
}

插入資料

PUT my_index/_doc/1
{
  "first_name": "John",
  "last_name": "Smith"
}

插敘資料

GET my_index/_search
{
  "query": {
    "match": {
      "full_name": { 
        "query": "John Smith",
        "operator": "and"
      }
    }
  }
}

查詢結果

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "my_index",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.5753642,
        "_source": {
          "first_name": "John",
          "last_name": "Smith"
        }
      }
    ]
  }
}

很明顯first_name 和 last_name 欄位取值都被複制到 full_name 欄位。

doc_values

是為了加快排序、聚合操作,在建立倒排索引的時候,額外增加一個列式儲存對映,是一個空間換時間的做法。預設是開啟的,對於確定不需要聚合或者排序的欄位可以關閉。

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "status_code": { 
          "type":       "keyword"
        },
        "session_id": { 
          "type":       "keyword",
          "doc_values": false
        }
      }
    }
  }
}

dynamic

預設情況下,欄位可以自動新增到文件或者文件的內部物件,elasticsearc也會自動索引對映欄位。

PUT my_index/_doc/1 
{
  "username": "johnsmith",
  "name": {
    "first": "John",
    "last": "Smith"
  }
}
GET my_index/_mapping 
PUT my_index/_doc/2 
{
  "username": "marywhite",
  "email": "[email protected]",
  "name": {
    "first": "Mary",
    "middle": "Alice",
    "last": "White"
  }
}
GET my_index/_mapping 

dynamic屬性用於配置新欄位新增時的對映動作,有三個取值:

  • true:新發現的欄位新增到對映中。(預設)
  • flase:新檢測的欄位被忽略。必須顯式新增新欄位。
  • strict:如果檢測到新欄位,就會引發異常並拒絕文件。

例如:

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic": false, 
      "properties": {
        "user": { 
          "properties": {
            "name": {
              "type": "text"
            },
            "social_networks": { 
              "dynamic": true,
              "properties": {}
            }
          }
        }
      }
    }
  }
}

enabled

ELasticseaech預設會索引所有的欄位,enabled設為false的欄位,elasicsearch會跳過欄位內容,該欄位只能從_source中獲取,但是不可搜。而且欄位可以是任意型別。

例如: 新建索引,插入文件

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "name":{"enabled": false}
      } 
    }
  }
}
PUT my_index/_doc/1
{
  "title": "test enabled",
  "name":"test"
}

檢視文件

GET my_index/_doc/1

結果

{
  "_index": "my_index",
  "_type": "my_type",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "title": "test enabled",
    "name": "test"
  }
}

搜尋欄位

GET my_index/_doc/_search
{
  "query": {
    "match": {
      "name": "test"
    }
  }
}

結果

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

fielddata

大多數的欄位預設會被索引,所以我們可以對他們檢索,排序,聚合,甚至指令碼操作, 然而,我們可能還需要與搜尋不同的訪問模式。

fielddata是text型的欄位查詢時使用一個記憶體型資料結構。該資料結構是根據需求第一次建立的,用於聚合、排序或指令碼。它是通過從磁碟讀取每個段的整個倒排索引、反轉術語_文件關係並將結果儲存在JVM堆的記憶體中來構建的。

fielddata在text型欄位預設是關閉的。 fielddata會佔用大量的堆記憶體,尤其是在載入的高基數的text型欄位。 一旦 fielddata 被載入到堆裡,它會一直存在於欄位的生命週期中。此外,載入欄位資料是一個昂貴的過程,這可能會導致使用者體驗延遲命中。這就是為什麼預設情況下禁用fielddata 的原因。

如果嘗試對文字欄位上的指令碼進行排序、聚合或訪問值,則會遇到此異常。

預設情況下,欄位資料在文字欄位上禁用。對需要設定的text型欄位設定fielddata = true,以便通過反轉倒排索引來載入記憶體中的欄位資料。注意,這可以使用大量的記憶體。

eager_global_ordinals

Global ordinals 是一個建立在 doc values 和 fielddata基礎上的資料結構, 它為每一個精確詞按照字母順序維護遞增的編號。每一個精確詞都有一個獨一無二的編號 並且 精確詞 A 小於精確詞 B的編號. Global ordinals 只支援 keyword and text 型欄位,在 keyword 欄位中, 預設是啟用的 而在 text 型欄位中 只有 fielddata 和相關屬性開啟的狀態下才是可用的。

format

JSON 文件內部,日期可能展現為欄位串的樣式. ElasticSearch 內部會將日期資料轉換為UTC,並存儲為milliseconds-since-the-epoch的long型整數。

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type":   "date",
          "format": "yyyy-MM-dd"
        }
      }
    }
  }
}

ignore_above

超過 ignore_above 的字串不會被索引。對於字串陣列, 如果單個子元素字串超過了 ignore_above也不會被索引儲存。

所有的字串或者陣列元素都會被在_source欄位裡,

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "message": {
          "type": "keyword",
          "ignore_above": 20 ,
          "
        }
      }
    }
  }
}

資料插入

PUT my_index/_doc/1 
{
  "message": "Syntax error"
}

PUT my_index/_doc/2 
{
  "message": "Syntax error with some long stacktrace"

            
           

相關推薦

ElasticSearch學習筆記 對映引數(Mapping parameters)

對映引數(Mapping parameters) analyzer 可分析的欄位的取值會被分析器經過Token過濾和字元過濾轉換為一系列的索引詞,舉例來說, 字串 “The quick Brown Foxes.” 依賴於所使用的分析器可以過濾分詞為: quic

ElasticSearch學習筆記二十 Pipeline Aggregations

ElasticSearch學習筆記之二十七 Pipeline Aggregations Pipeline Aggregations buckets_path 語法 Special Paths(特殊路徑) Dealing with dots

ElasticSearch學習筆記二十 Java REST Client

Java REST Client Java REST Client分為2種: Java Low Level REST Client: Elasticsearch官方 low-level client . 它允許你通過http和 Elasticsearch 叢

機器學習筆記——邏輯迴歸簡單推導、softmax簡單理解以及sklearn中邏輯迴歸常用引數解釋

邏輯迴歸 對邏輯迴歸的理解:對線性迴歸的假設函式的 f(x) 又套上了一層sigmoid函式,即g(f(x)). 然後sigmoid函式是長這樣的: 它的影象長這樣: 對於線性迴歸得到的結果,再經過一層sigmoid函式,以x=0為界限,左邊為0,右邊為1,邏輯迴歸就是這樣一個二分類

ceph學習筆記 數據平衡

ceph sds 恢復 數據平衡 當在集群中新增一個OSD設備時,整個集群將會發生數據遷移使數據重新分布達到均衡。在Ceph集群中數據遷移的的基本單位是PG。其實在遷移過程中是將PG中的所有對象作為一個整體來進行遷移。數據遷移觸發流程: 1、當新加入一個OSD時,會改變系統的CRUSH Map

R語言學習筆記

head ace row any type 分析 min 記錄 ted 摘要: 僅用於記錄R語言學習過程: 內容提要: 缺失值的識別與處理; 異常值與重復值的處理 正文: 缺失值的識別與處理 導讀: > x <- c(1,2,3,NA,NA,4)

Memcached學習筆記:memcached+magent+keepalived高可用叢集

上一篇我們說過memcached實現高可用以及防止單點故障可以通過magent來實現,接下來我們來配置一個高可用群集 magent代理伺服器:192.168.200.101 memcached節點:(可以在同一個伺服器上開啟三個memcached節點看前面介紹,也可以一臺伺服器一個) m

ElasticSearch學習筆記二十八 細說Pipeline Aggregations

ElasticSearch學習筆記之二十八 細說Pipeline Aggregations Avg Bucket Aggregation(平均值分組聚合) Syntax(語法) avg_bucket 引數 Max Bucket Ag

ElasticSearch學習筆記三十二 JAVA Client Exists Delete Update APIs

ElasticSearch學習筆記之三十二 JAVA Client 之 Exists Delete Update APIs Exists API Exists Request Synchronous Execution(同步執行) Asy

ElasticSearch學習筆記三十一 JAVA Client GET APIs

ElasticSearch學習筆記之三十一 JAVA Client 之 GET APIs Get API Get Request Optional arguments(引數配置) Synchronous Execution(同步執行)

ElasticSearch學習筆記三十 JAVA Client Document APIs

ElasticSearch學習筆記之三十 JAVA Client 之 文件請求概述 Document APIs(文件APIS) Index API Index Request(索引請求) Providing the document sou

ElasticSearch學習筆記二十九 Java REST Client

ElasticSearch學習筆記之二十九 Java REST Client Java REST Client Java High Level REST Client Compatibility(相容性) Javadoc Maven Reposi

ElasticSearch學習筆記二十二 指標聚合續

ElasticSearch學習筆記之二十二 指標聚合續 Max Aggregation Min Aggregation Percentiles Aggregation Stats Aggregation Sum Aggregation Va

ElasticSearch學習筆記二十一 指標聚合

ElasticSearch學習筆記之二十一 指標聚合 指標聚合 Avg Aggregation Script Value Script Missing value Weighted Avg Agg

ElasticSearch學習筆記二十五 索引詞聚合

ElasticSearch學習筆記之二十五 索引詞聚合 Terms Aggregation(索引詞聚合) Size Document counts are approximate(文件計數是近似值) Shard Size Calc

ElasticSearch學習筆記二十四 桶聚合續

ElasticSearch學習筆記之二十四 桶聚合續 Date Range Aggregation(時間範圍聚合) Missing Values Date Format/Pattern Time zone in date range ag

ElasticSearch學習筆記二十三 桶聚合

ElasticSearch學習筆記之二十三 桶聚合 桶聚合 Children Aggregation(子聚合) Range Aggregation(範圍聚合) Keyed Response

ElasticSearch學習筆記原理介紹

ElasticSearch是一個基於Lucene的搜尋伺服器。它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful web介面。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放原始碼釋出,是當前流行的企業級搜尋引擎。設計用於雲端計算中,能夠達到實時搜尋,穩

Nordic nRF5 SDK 學習筆記, 功耗評估及電源優化

NORDIC 官方評估功耗線上測試 NORDIC Online Power Profiler,https://devzone.nordicsemi.com/power/ NORDIC 關於低功耗的官方部落格 https://devzone.nordicsemi.com

ElasticSearch學習筆記三十三 IK分詞器擴充套件字典及text全文型別資料分詞聚合查詢

ElasticSearch學習筆記之三十三 IK分詞器擴充套件字典及text全文型別資料分詞聚合查詢 專屬詞彙分詞失敗 擴充套件字典 檢視當前詞庫 自定義詞典 更新配置 再次檢視分詞 text全文型別資料分詞聚合