ES 筆記十二: 顯示 Mapping 設定與常見引數

CrazyZard發表於2019-10-22
    PUT movies
    {
        "mappings" : {
            // define your mappings here
        }
    }
  • 可以參考API手冊,純手寫
  • 為了減少輸入的工作量,減少出錯率,依照以下步驟
    • 建立一個臨時的index,寫入一些樣本資料
    • 通過訪問 Mapping API獲得該臨時檔案的動態 Mapping 定義
    • 修改後用,使用該配置建立的索引
    • 刪除臨時索引
  • index - 控制當前欄位是否被索引。預設為true。如果設定成false,該欄位不可被搜尋。
    PUT users
    {
    "mappings" : {
      "properties" : {
        "firstName" : {
          "type" : "text"
        },
        "lastName" : {
          "type" : "text"
        },
        "mobile" : {
          "type" : "text",
          "index": false
        }
      }
    }
    }
  • 四種不同級別的 Index Options 配置,可以控制倒排索引記錄的內容
    • docs - 記錄 doc id
    • freqs - 記錄 doc id 和 term frequencies
    • positions - 記錄 doc id / term frequencies / term position
    • offsets - doc id / term frequencies / term posistion / character offects
  • Text 型別預設記錄 postions,其他預設為docs
  • 記錄內容越多,佔用儲存空間越大
  • 需要對NULL 值實現搜尋
  • 只有 Keyword 型別支援設定 Null_Value
    DELETE users
    PUT users
    {
    "mappings" : {
      "properties" : {
        "firstName" : {
          "type" : "text"
        },
        "lastName" : {
          "type" : "text"
        },
        "mobile" : {
          "type" : "keyword", //這個如果是text 無法設定為空
          "null_value": "NULL"
        }
      }
    }
    }
    PUT users/_doc/2
    {
    "firstName":"Li",
    "lastName": "Sunke",
    "mobile": null
    }
    GET users/_search?q=mobile:NULL
    //搜尋結果
    "_source" : {
          "firstName" : "Li",
          "lastName" : "Sunke",
          "mobile" : null
        }
  • _all 在 7中已經被 copy_to 所替代
  • 滿足一些特定的搜尋需求
  • copy_to 將欄位的數值拷貝到目標欄位,實現類似 _all 的作用
  • copy_to 的目標欄位不出現在_source 中
    DELETE users
    PUT users
    {
    "mappings": {
    "properties": {
      "firstName":{
        "type": "text",
        "copy_to": "fullName"
      },
      "lastName":{
        "type": "text",
        "copy_to": "fullName"
      }
    }
    }
    }
    PUT users/_doc/1
    {
    "firstName":"Li",
    "lastName": "Sunke"
    }
    //沒有新建欄位
    GET users/_doc/1
    {
    "_index" : "users",
    "_type" : "_doc",
    "_id" : "1",
    "_version" : 1,
    "_seq_no" : 0,
    "_primary_term" : 1,
    "found" : true,
    "_source" : {
    "firstName" : "Li",
    "lastName" : "Sunke"
    }
    }
    GET users/_search?q=fullName:(Li sunke)
  • Elasticsearch 中不提供專門的陣列型別。但是任何欄位,都可以包含多個相同型別的數值
    DELETE users
    PUT users/_doc/1
    {
    "name":"onebird",
    "interests":"reading"
    }
    PUT users/_doc/1
    {
    "name":"twobirds",
    "interests":["reading","music"]
    }
    GET users/_mapping 
    //部分程式碼
    "interests" : {
          "type" : "text", //型別還是text
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }

PS: text型別會使用預設分詞器分詞,當然你也可以為他指定特定的分詞器。如果定義成keyword型別,那麼預設就不會對其進行分詞。

es對字串型別的mapping設定,會將其定義成text,同時為他定義一個叫做keyword的子欄位。keyword只是他的名字,你也可以定義成kw。這個欄位的型別是keyword(這是一個型別的關鍵字)

多欄位型別情況下,你可以查詢 title,也可以查詢title.keyword查詢型別為keyword的子欄位

本作品採用《CC 協議》,轉載必須註明作者和本文連結

快樂就是解決一個又一個的問題!

相關文章