Elasticsearch8.1 -- 6. Mapping 中的基本字段類型

字段類型按family分組。同一族中的類型具有完全相同的搜索行為,但可能具有不同的空間使用或性能特征。

目前,除了字符串有兩種family類型:keywordtext。 其他類型系列只有一個(gè)字段類型, 例如boolean類型族由一種字段類型組成:boolean

常見類型
  • binary
    編碼為 Base64 字符串的二進(jìn)制值。 該字段默認(rèn) 不存儲(chǔ)到索引 且 不可搜索。

    參數(shù) 意義
    doc_values 該字段是否應(yīng)該以列的方式存儲(chǔ)在磁盤上,以便以后可以用于排序、聚合或腳本?默認(rèn)為false 。
    store 字段值是否應(yīng)與字段_source分開存儲(chǔ)和檢索。接受truefalse (默認(rèn))。

    參數(shù)講解:

    1. doc_values: 倒排索引這種數(shù)據(jù)結(jié)構(gòu)并不適合用作聚合,排序,在腳本里訪問字段等等這些場(chǎng)景,于是 doc_values 數(shù)據(jù)結(jié)構(gòu)應(yīng)運(yùn)而生。 doc_values 為 true 時(shí),es同時(shí)會(huì)以列的方式保存一份數(shù)據(jù)用作聚合,排序。

    binary數(shù)據(jù)類型使用:

    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "blob": {
            "type": "binary",
            "doc_values": false,
            "store": false
          }
        }
      }
    }
    
  • boolean
    true 或者 false

    參數(shù) 意義
    doc_values 該字段是否應(yīng)該以列的方式存儲(chǔ)在磁盤上,以便以后可以用于排序、聚合或腳本?默認(rèn)為false 。
    index 該字段是否應(yīng)該可以快速搜索?接受true(默認(rèn))和 false. 僅doc_values 啟用的字段仍然可以使用基于術(shù)語或范圍的查詢進(jìn)行查詢,盡管速度較慢。
    null_value 當(dāng)文檔中該字段為空時(shí),這個(gè)值會(huì)當(dāng)作默認(rèn)值填充到字段中。默認(rèn)為null,這意味著該字段被視為缺失。請(qǐng)注意,如果使用參數(shù),則 script 無法設(shè)置。
    script 字段值將基于腳本轉(zhuǎn)換所得, 不再依賴doc文檔中的輸入。
    on_script_error script中的腳本運(yùn)行失敗時(shí)的策略。默認(rèn)為 fail, 返回doc文檔插入失敗。
    store 字段值是否應(yīng)與字段_source分開存儲(chǔ)和檢索。接受truefalse (默認(rèn))。
    meta 關(guān)于字段的元數(shù)據(jù)。
  • Keywords
    Keywords關(guān)鍵字族,包括 keyword、 constant_keywordwildcard
    關(guān)鍵字字段通常用于排序, 聚合, 術(shù)語級(jí)別的查詢 ,例如term。

    • keyword
      適用于 結(jié)構(gòu)化內(nèi)容 ,例如 ID、電子郵件地址、主機(jī)名、狀態(tài)代碼、郵政編碼或標(biāo)簽。
      參數(shù) 意義
      doc_values 該字段是否應(yīng)該以列的方式存儲(chǔ)在磁盤上,以便以后可以用于排序、聚合或腳本?默認(rèn)為true
      eager_global_ordinals 是否應(yīng)該在刷新時(shí)急切地加載全局序數(shù)?接受true或false (默認(rèn))。對(duì)于常用于術(shù)語聚合的字段建議開啟。
      fields 多字段允許為不同目的以多種方式索引相同的字符串值,例如一個(gè)用于搜索的字段和一個(gè)用于排序和聚合的多字段。
      ignore_above 不要索引任何長(zhǎng)于該值的字符串。默認(rèn)為,2147483647 以便接受所有值。但是請(qǐng)注意,默認(rèn)動(dòng)態(tài)映射規(guī)則會(huì)創(chuàng)建一個(gè)子keyword字段,通過設(shè)置覆蓋此默認(rèn)值ignore_above: 256。
      index 該字段是否應(yīng)該可以快速搜索?接受true(默認(rèn))和 false. 僅doc_values 啟用的字段仍然可以使用基于術(shù)語或范圍的查詢進(jìn)行查詢,盡管速度較慢。
      index_options 出于評(píng)分目的,應(yīng)將哪些信息存儲(chǔ)在索引中。默認(rèn)為docs但也可以設(shè)置為freqs在計(jì)算分?jǐn)?shù)時(shí)考慮詞頻。
      meta 關(guān)于字段的元數(shù)據(jù)。
      norms 字段長(zhǎng)度是否對(duì)查詢?cè)u(píng)分有影響。接受true或false(默認(rèn))。
      null_value 當(dāng)文檔中該字段為空時(shí),這個(gè)值會(huì)當(dāng)作默認(rèn)值填充到字段中。默認(rèn)為null,這意味著該字段被視為缺失。請(qǐng)注意,如果使用參數(shù),則 script 無法設(shè)置。
      script 字段值將基于腳本轉(zhuǎn)換所得, 不再依賴doc文檔中的輸入。
      on_script_error script中的腳本運(yùn)行失敗時(shí)的策略。默認(rèn)為 fail, 返回doc文檔插入失敗。
      store 字段值是否應(yīng)與字段_source分開存儲(chǔ)和檢索。接受truefalse (默認(rèn))。
      similarity 應(yīng)該使用 哪種評(píng)分算法或相似度。默認(rèn)為BM25.
      normalizer 如何在索引之前對(duì)關(guān)鍵字進(jìn)行預(yù)處理。默認(rèn)為null,表示關(guān)鍵字保持原樣。
      split_queries_on_whitespace 為該字段構(gòu)建查詢時(shí),全文查詢是否應(yīng)在空格上拆分輸入。接受true或false(默認(rèn))。
      參數(shù)講解:
      1. eager_global_ordinals:為了支持字段值的聚合和其他操作,Elasticsearch 使用了一種稱為 doc values 的數(shù)據(jù)結(jié)構(gòu)。在基于字段類型為術(shù)語的場(chǎng)景下, 使用 增量整數(shù)或序數(shù) 替代 相同的術(shù)語 可以使 doc values 存儲(chǔ)更緊湊。
      2. fields:給字段設(shè)置額外的類型和索引方式。例如主類型為text用于全文搜索,同時(shí)設(shè)置一個(gè)keyword用于排序或聚合。
      3. ignore_above :超過ignore_above值所標(biāo)記的長(zhǎng)度,則不會(huì)被存儲(chǔ)和索引(不影響_source的原始數(shù)據(jù))。默認(rèn)為 2147483647, 基本可接受全部長(zhǎng)度。
      4. index:該字段是否應(yīng)該被快速搜索(被倒排索引存儲(chǔ)),接受true(默認(rèn))和 false。如果字段 doc_values 存在仍然可以被查詢, 只是相對(duì)比慢一些(doc_values對(duì)應(yīng)的是正排索引)。

    • constant_keyword
      適用于始終包含相同值的關(guān)鍵字字段, 例如 枚舉值。

    • wildcard
      用于非結(jié)構(gòu)化機(jī)器生成的內(nèi)容, 例如日志等一些需要經(jīng)常正則匹配查詢的內(nèi)容。
  • Numbers
    數(shù)字類型,例如 longdouble ,用于表示金額。

    數(shù)字類型 參考
    long 一個(gè)有符號(hào)的 64 位整數(shù),最小值為-2^{63},最大值為2^{63} -1。
    integer 一個(gè)有符號(hào)的 32 位整數(shù),最小值為-2^{31},最大值為2^{31} -1。
    short 一個(gè)有符號(hào)的 16 位整數(shù),最小值為 -32768,最大值為 32767 。
    byte 一個(gè)有符號(hào)的 8 位整數(shù),最小值為-128,最大值為127。
    double 雙精度 64 位 IEEE 754 浮點(diǎn)數(shù),限制為有限值。
    float 單精度 32 位 IEEE 754 浮點(diǎn)數(shù),限制為有限值。
    half_float 半精度 16 位 IEEE 754 浮點(diǎn)數(shù),限制為有限值。
    scaled_float 由 long 支持的浮點(diǎn)數(shù),按固定double比例因子縮放。
    unsigned_long 一個(gè)無符號(hào)的 64 位整數(shù),最小值為 0,最大值為 2^{64} -1
    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "number_of_bytes": {
            "type": "integer"
          },
          "time_in_seconds": {
            "type": "float"
          },
          "price": {
            "type": "scaled_float",
            "scaling_factor": 100
          }
        }
      }
    }
    
    參數(shù) 意義
    coerce 嘗試將字符串轉(zhuǎn)換為數(shù)字并截?cái)嗾麛?shù)的分?jǐn)?shù)。接受true(默認(rèn))和false.
    doc_values 該字段是否應(yīng)該以列的方式存儲(chǔ)在磁盤上,以便以后可以用于排序、聚合或腳本?默認(rèn)為false 。
    ignore_malformed 是否忽略錯(cuò)誤格式的數(shù)字。如果false(默認(rèn)),格式錯(cuò)誤的數(shù)字會(huì)引發(fā)異常并拒絕整個(gè)文檔。
    index 該字段是否應(yīng)該可以快速搜索?接受true(默認(rèn))和 false. 僅doc_values 啟用的字段仍然可以使用基于術(shù)語或范圍的查詢進(jìn)行查詢,盡管速度較慢。
    null_value 當(dāng)文檔中該字段為空時(shí),這個(gè)值會(huì)當(dāng)作默認(rèn)值填充到字段中。默認(rèn)為null,這意味著該字段被視為缺失。請(qǐng)注意,如果使用參數(shù),則 script 無法設(shè)置。
    script 字段值將基于腳本轉(zhuǎn)換所得, 不再依賴doc文檔中的輸入。
    on_script_error script中的腳本運(yùn)行失敗時(shí)的策略。默認(rèn)為 fail, 返回doc文檔插入失敗。
    store 字段值是否應(yīng)與字段_source分開存儲(chǔ)和檢索。接受truefalse (默認(rèn))。
    meta 關(guān)于字段的元數(shù)據(jù)。
  • Dates
    日期類型,包括datedate_nanos。

  • alias
    映射定義索引中字段的alias備用名稱。別名可用于代替搜索請(qǐng)求中的目標(biāo)字段。別名的使用限制:

      1. 目標(biāo)必須是具體字段,而不是對(duì)象或其他字段別名。
      1. 目標(biāo)字段在創(chuàng)建別名時(shí)必須存在。
      1. 如果定義了嵌套對(duì)象,則字段別名必須具有與其目標(biāo)相同的嵌套范圍。
      1. 字段別名只能有一個(gè)目標(biāo)

對(duì)象和關(guān)系類型
  • object
    一個(gè) JSON 對(duì)象。
    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "region": {
            "type": "keyword"
          },
          "manager": {
            "properties": {
              "age":  { "type": "integer" },
              "name": {
                "properties": {
                  "first": { "type": "text" },
                  "last":  { "type": "text" }
                }
              }
            }
          }
        }
      }
    }
    
    參數(shù) 意義
    dynamic 是否允許在插入文檔doc時(shí)由動(dòng)態(tài)映射為object的properties新增屬性。接受true(默認(rèn))runtime、false 和strict。
    enabled 為對(duì)象字段提供的 JSON 值是否應(yīng)該被解析和索引(true默認(rèn))或完全忽略(false)。
    properties 對(duì)象內(nèi)的字段,可以是任何數(shù)據(jù)類型,包括object。 可以將新屬性添加到現(xiàn)有對(duì)象。
  • flattened
    默認(rèn)情況下, ES會(huì)為object中每個(gè)子字段進(jìn)行映射和索引(如果事先不知道子字段的名稱和類型, 則動(dòng)態(tài)映射它們)。 這種情況下, 如果這個(gè)object類型的對(duì)象存在大量的子字段, 會(huì)導(dǎo)致子字段映射爆炸。而flattened類型就是為這種情況應(yīng)運(yùn)而生的。

    ES會(huì)把flattened類型的JSON對(duì)象作為單個(gè)字段,只把它的 葉子值 作為關(guān)鍵字索引一個(gè)字段中。然后可以通過簡(jiǎn)單的查詢和聚合來搜索對(duì)象的內(nèi)容。

    PUT bug_reports
    {
      "mappings": {
        "properties": {
          "title": {
            "type": "text"
          },
          "labels": {
            "type": "flattened"
          }
        }
      }
    }
    
    POST bug_reports/_doc/1
    {
      "title": "Results are not sorted correctly.",
      "labels": {
        "priority": "urgent",
        "release": ["v1.2.5", "v1.3.0"],
        "timestamp": {
          "created": 1541458026,
          "closed": 1541457010
        }
      }
    }
    
    # 這里的查詢直接以 ‘labels’ 作為關(guān)鍵字!??!
    POST bug_reports/_search
    {
      "query": {
        "term": {"labels": "urgent"}
      }
    }
    
    參數(shù) 意義
    depth_limit 就嵌套內(nèi)部對(duì)象而言,展平對(duì)象字段的最大允許深度。如果展平的對(duì)象字段超過此限制,則會(huì)引發(fā)錯(cuò)誤。默認(rèn)為20
    doc_values 該字段是否應(yīng)該以列的方式存儲(chǔ)在磁盤上,以便以后可以用于排序、聚合或腳本?接受true (默認(rèn))或false.
    eager_global_ordinals 是否應(yīng)該在刷新時(shí)急切地加載全局序數(shù)?接受true或false (默認(rèn))。對(duì)于常用于術(shù)語聚合的字段建議開啟。
    ignore_above 超過此限制的葉值將不會(huì)被索引。默認(rèn)情況下,沒有限制,所有值都將被索引。請(qǐng)注意,此限制適用于展平對(duì)象字段中的葉值,而不是整個(gè)字段的長(zhǎng)度。
    index 確定該字段是否應(yīng)該是可搜索的。接受true(默認(rèn))或 false.
    index_options 出于評(píng)分目的,應(yīng)將哪些信息存儲(chǔ)在索引中。默認(rèn)為docs但也可以設(shè)置為freqs在計(jì)算分?jǐn)?shù)時(shí)考慮詞頻。
    null_value 當(dāng)文檔中該字段為空時(shí),這個(gè)值會(huì)當(dāng)作默認(rèn)值填充到字段中。默認(rèn)為null,這意味著該字段被視為缺失。請(qǐng)注意,如果使用參數(shù),則 script 無法設(shè)置。
    similarity 應(yīng)該使用 哪種評(píng)分算法或相似度。默認(rèn)為BM25.
    split_queries_on_whitespace 為該字段構(gòu)建查詢時(shí),全文查詢是否應(yīng)在空格上拆分輸入。接受true或false(默認(rèn))。
  • nested
    nested類型是object數(shù)據(jù)類型的特殊版本,它允許對(duì)對(duì)象數(shù)組進(jìn)行索引,從而可以相互獨(dú)立地查詢它們。

    默認(rèn)情況下, object數(shù)據(jù)類型對(duì)于數(shù)組的映射和索引使用的是扁平化展開的方式。

    PUT my-index-000001/_doc/1
    {
     "group" : "fans",
     "user" : [
       {
         "first" : "John",
         "last" :  "Smith"
       },
       {
         "first" : "Alice",
         "last" :  "White"
       }
     ]
    }
    

    實(shí)際上,上面文檔將在內(nèi)部轉(zhuǎn)換為看起來更像這樣的文檔:

    {
      "group" :        "fans",
      "user.first" : [ "alice", "john" ],
      "user.last" :  [ "smith", "white" ]
    }
    

    為了讓object類型字段內(nèi)的數(shù)組對(duì)象之間保持獨(dú)立性,nested便應(yīng)運(yùn)而生了?。?!

    參數(shù) 意義
    dynamic 是否允許在插入文檔doc時(shí)由動(dòng)態(tài)映射為object的properties新增屬性。接受true(默認(rèn))runtime、false 和strict。
    properties 對(duì)象內(nèi)的字段,可以是任何數(shù)據(jù)類型,包括object。 可以將新屬性添加到現(xiàn)有對(duì)象。
  • join
    為同一索引中的文檔定義父/子關(guān)系。

    • mapping定義,relations:{ "parent-field" : "child-field"}
    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "my_id": {
            "type": "keyword"
          },
          "my_join_field": {
            "type": "join",
            "relations": {
              "question": "answer"
            }
          }
        }
      }
    }
    
    • 插入parent-doc的兩種方式
    PUT my-index-000001/_doc/1?refresh
    {
      "my_id": "1",
      "text": "This is a question",
      "my_join_field": {
        "name": "question"
      }
    }
    
    PUT my-index-000001/_doc/1?refresh
    {
      "my_id": "1",
      "text": "This is a question",
      "my_join_field": "question"
    }
    
    • 插入child-doc
    PUT my-index-000001/_doc/3?routing=1&refresh 
    {
      "my_id": "3",
      "text": "This is an answer",
      "my_join_field": {
        "name": "answer",
        "parent": "1" 
      }
    }
    
    1.  `?routing=parent-doc-id`路由值是強(qiáng)制性的,因?yàn)楦肝臋n和子文檔必須在同一個(gè)分片上建立索引。
    2.  `"answer"`為 `parent/child` 關(guān)系中的`child`, 因此必須添加`"parent"`字段, 且填充`parent/child` 關(guān)系中的`parent-id`。
    3.  在`插入parent-doc`的例子里面, 沒有添加`"parent"`字段。因?yàn)閌"question"`是`parent/child` 關(guān)系中的`parent`,插入`parent-doc`時(shí), ES會(huì)默認(rèn)填充`_id`到`"parent"`字段中。
    
    • join 使用限制

      1. 一個(gè)索引最多只能有一個(gè)join 類型字段
      2. parent-docchild-doc 必須在同一個(gè)shard分片中
      3. 一個(gè)元素可以有多個(gè)子元素,但只有一個(gè)父元素。
      4. 可以向現(xiàn)有join字段添加新關(guān)系。
      5. 也可以將子元素添加到現(xiàn)有元素,但前提是該元素已經(jīng)是父元素。
    • 使用 join 搜索

      1. join 會(huì)創(chuàng)建一個(gè)字段來索引文檔中的關(guān)系名稱, 例如question, answer
      2. 它還為每個(gè)parent/child關(guān)系創(chuàng)建一個(gè)字段, 例如"my_join_field#question" , 如果該文檔為parent-doc:question則為自身_id, 如果該文檔為child-doc:answer_id為鏈接到父文檔。
      GET my-index-000001/_search
      {
        "query": {
          "parent_id": { 
            "type": "answer",
            "id": "1"
          }
        },
        "aggs": {
          "parents": {
            "terms": {
              "field": "my_join_field#question", 
              "size": 10
            }
          }
        },
        "runtime_mappings": {
          "parent": {
            "type": "long",
            "script": """
              emit(Integer.parseInt(doc['my_join_field#question'].value)) 
            """
          }
        },
        "fields": [
          { "field": "parent" }
        ]
      }
      
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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