1. 程式人生 > >Elasticsearch系列---初識mapping

Elasticsearch系列---初識mapping

概要

本篇簡單介紹一下field資料型別mapping的相關知識。

mapping是什麼?

前面幾篇的實戰案例,我們向Elasticsearch索引資料時,只是簡單地把JSON文字放在請求體裡,至於JSON裡的field型別,儲存到ES裡是什麼型別,中間是怎麼做的對映,這個對映過程,就是mapping要解決的問題。

mapping簡單來說,就是解決JSON文字內容到field型別對映關係的定義。將時間域視為時間型別,數字視為數字型別,字串識別為全文或精確值字串,這個識別的過程,叫做mapping。

Elasticsearch支援的簡單域型別,類似於Java的基礎資料型別,有如下幾種:

  • 字串:text,keyword
  • 整數 : byte, short, integer, long
  • 浮點數: float, double
  • 布林型: boolean
  • 日期: date

當Elasticsearch收到JSON基本資料型別內容時,使用如下規則進行型別對映:
| JSON type | domain type
| :---- | :--: | -----: |
| 布林型: true 或者 false | boolean
| 整數: 123 | long
| 浮點數: 123.45 | double
| 日期格式的字串: 2014-09-15 | date
| 字串: love you | text

檢視對映

每個索引都可以通過/_mapping查詢各個field的對映結果,ES本身有自動mapping的過程,但mapping後的結果一定要仔細檢查一下。

查詢請求:

GET /music/_mapping/children

響應結果:

{
  "music": {
    "mappings": {
      "children": {
        "properties": {
          "content": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "language": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            },
            "fielddata": true
          },
          "length": {
            "type": "long"
          },
          "likes": {
            "type": "long"
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

mapping中就自動定義了每個field的資料型別,properties下面的是各個field欄位的名稱、型別等資訊,text型別的還帶一個keyword子field。

資料型別的分詞規則

index在建立時或索引資料時,如果沒有手動指定mapping資訊,Elasticsearch會用它的規則自動為我們建立type資訊,以及type對應的mapping,mapping中包含了每個field對應的資料型別,以及如何分詞等設定。

不同型別的field,有的是精確搜尋(exact value),有的是全文搜尋(full text)。

  • exact value,在建立倒排索引的時候,是將整個值一起作為一個關鍵詞建立到倒排索引中的,並且大小寫敏感;
  • full text,會經歷各種各樣的處理,分詞,normaliztion(時態轉換,同義詞轉換,大小寫轉換),才會建立到倒排索引中。

在一個搜尋請求過來的時候,對exact value field和full text field進行搜尋的會與當初建立倒排索引的行為保持一致;比如說exact value搜尋的時候,就是直接按照整個值進行匹配,full text query string,也會進行分詞和normalization再去倒排索引中去搜索,這樣才能達到預期的搜尋效果。

ES基本的幾種field型別,除了text是使用full text,其他的都是exact value,總結來說mapping,決定了資料型別,建立倒排索引的行為,還有進行搜尋的行為。

自定義對映

基本資料型別基本夠用,但是有些資料可能需要自定義對映,尤其是字串,string型別預設是full text,但是我們可以自己定義分詞器,不同的分詞器,會帶來不一樣的搜尋效果,string型別最重要的屬性是index和analyzer。

index

這個屬性控制字串的索引規則,有三個值可供選擇:

  • true:支援索引,並且依據當前型別決定是全文搜尋還是精確匹配
  • false:不索引

例如:

{
    "author": {
        "type":     "text",
        "index":    true
    }
}

analyzer

這個屬性控制字串使用的分詞器,在支援中文的系統裡,這個屬性經常被用到,各路分詞器大顯身手,都需要用這個屬性來指定,如:

{
    "content": {
        "type":     "text",
        "analyzer":    "aliws"
    }
}

測試對映

我們在建立索引之後,可以通過測試命令來檢視不同的field的對映結果,即full text型別的是否有分詞, exact value的是否原樣保留,text的內容可以隨意輸入,當把這個作用工具除錯時,可以診斷的內容的分詞情況,舉例如下:

  1. full text型別
GET /music/_analyze
{
  "field": "content",
  "text": "let me sleep" 
}

結果:

{
  "tokens": [
    {
      "token": "let",
      "start_offset": 0,
      "end_offset": 3,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "me",
      "start_offset": 4,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "sleep",
      "start_offset": 7,
      "end_offset": 12,
      "type": "<ALPHANUM>",
      "position": 2
    }
  ]
}
  1. exact value型別
GET /music/_analyze
{
  "field": "content.keyword",
  "text": "let me sleep" 
}

結果:

{
  "tokens": [
    {
      "token": "let me sleep",
      "start_offset": 0,
      "end_offset": 12,
      "type": "word",
      "position": 0
    }
  ]
}

注意一個小細節:Elasticsearch在自動建立text型別時,為full text,但會自動建立一個keywork子field,這個子field是exact value型別的。

小結

本篇主要介紹了一個mapping的概念,基礎資料型別,以及檢視對映資訊和測試field對映效果的方法,測試對映效果算是一個比較有用的工具,後期實際開發中,遇到需要診斷的內容,可以用這個工具協助排查問題。

專注Java高併發、分散式架構,更多技術乾貨分享與心得,請關注公眾號:Java架構社群

相關推薦

Elasticsearch系列---初識mapping

概要 本篇簡單介紹一下field資料型別mapping的相關知識。 mapping是什麼? 前面幾篇的實戰案例,我們向Elasticsearch索引資料時,只是簡單地把JSON文字放在請求體裡,至於JSON裡的field型別,儲存到ES裡是什麼型別,中間是怎麼做的對映,這個對映過程,就是mapping要解決的

Elasticsearch系列---初識搜尋

概要 本篇主要介紹搜尋的報文結構含義、搜尋超時時間的處理過程,提及了一下多索引搜尋和輕量搜尋,最後將精確搜尋與全文搜尋做了簡單的對比。 空搜尋 搜尋API最簡單的形式是不指定索引和型別的空搜尋,它將返回叢集下所有索引的所有文件(預設顯示10條): GET /_search 響應的結果示例(有篩選,只取了一條d

Elasticsearch 7 探索之路】(六)初識 Mapping

上一篇主要講解什麼是 URL Search 和 Request Body Search 的語法。本篇對 Mapping 的 Dynamic Mapping 以及手動建立 Mapping 進行講解。 1.什麼是 Mapping Mapping 類似資料庫中的 schema 的定義,作用如下 定義索引中的欄位

elasticsearch index 之 Mapping

splay ima 更多 trie name .post 結構 emp parser Lucene索引的一個特點就filed,索引以field組合。這一特點為索引和搜索提供了很大的靈活性。elasticsearch則在Lucene的基礎上更近一步,它可以是 no schem

elasticsearch系列(四)部署

linux .tar.gz ast 官方 hup bin arc 分享 quest linux環境 centOS6.8 本文采用tar包的方式部署es 準備jdk8的環境 5.4.0的es依賴jdk8及以上版本 下載linux版的jdk jdk-8u121-linux-x6

ElasticSearch添加mapping

log void exe replicas blog 創建 修改 index obj 1.創建索引 /** * 創建索引 * * @param indexName */public static void createIndex(String indexName) {

搜索引擎ElasticSearch系列(四): ElasticSearch2.4.4 sql插件安裝

china code als 插件 技術分享 -s fun nlp 4.0 一:ElasticSearch sql插件簡介   With this plugin you can query elasticsearch using familiar SQL syntax.

elasticsearch系列(六)備份

indices stat 必須 tor 信息 操作 accepted gui 配置 快照備份 1.創建文件倉庫 1.1 在$ELASTICSEARCH_HOME/config/elasticsearch.yaml中增加配置 #這個路徑elasticsearch必須有權限訪問

elasticsearch系列(七)java定義score

集群 scrip image search 支持 name dsr 計算方法 dynamic 概述 ES支持groovy 和 java兩種語言自定義score的計算方法,groovy甚至可以嵌套在請求的參數中,有點厲害,不過不在本篇討論範圍。 如何用自定義的java代碼來定

ElasticSearch 6.2 Mapping參數說明

ping 接受 value led 說明 ear 新增 rst type 背景: 由於本人使用的是6.0以上的版本es,在使用發現很多中文已過時。ES6.0以後有很多參數變化。 現我根據官網總結mapping最新的參數,希望能對大家有用處。 新增字段:   eager_gl

Elasticsearch 5.4 Mapping詳解

targe AI ref last OS clas class 5.4 blog 這裏面講解的mapping說的很清楚了。 http://blog.csdn.net/napoay/article/details/73100110 修改mapping就比較坑了:

ElasticSearch篇】--ElasticSearch初識到安裝和應用

sequence ria wan shard 主機 single when please lock 一、前述 ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基於RESTful web接口,在企業中全文搜索時,特別常

Linux系列 初識ngnix——ngnix安裝及配置表內容詳解、讓nginx支持並顯示國家及其城市

ngnix安裝 nginx配置表內容Nginx(engine x)是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。功能:1.高性能的HTTP Server,解決c10k的問題2.高性能的反向代理服務器,給網站加速3.做為LB集群的前端一個負載均衡器nginx的優勢 IO

ElasticSearch 系列隨筆

www 錯誤 問題 day last del home AI 插入 1.ElasticSearch 常用設置 2.ElasticSearch 從2.2升級到6.2.4後在Kibana註意問題 (Validation Failed: 1: an id must be pro

elasticsearch系列一:elasticsearch(ES簡介、安裝&配置、集成Ikanalyzer)

ins 表示 吞吐量 search 工作 use art tcp傳輸 .net 一、ES簡介 1. ES是什麽? Elasticsearch 是一個開源的搜索引擎,建立在全文搜索引擎庫 Apache Lucene 基礎之上 用 Java 編寫的,它的內部使用 Lucene

elasticsearch系列三:索引詳解(分詞器、文檔管理、路由詳解)

ces com dex 合並 pda ams 最新 case dbi 一、分詞器 1. 認識分詞器 1.1 Analyzer 分析器 在ES中一個Analyzer 由下面三種組件組合而成: character filter :字符過濾器,對文本進行字符過濾處理,

elasticsearch系列八:ES 集群管理(集群規劃、集群搭建、集群管理)

記得 文件 如果 cse init host 網絡隔離 也有 沒有 一、集群規劃 搭建一個集群我們需要考慮如下幾個問題: 1. 我們需要多大規模的集群? 2. 集群中的節點角色如何分配? 3. 如何避免腦裂問題? 4. 索引應該設置多少個分片? 5. 分片應該設置幾個副本?

mybatis 解讀系列-初識

工作 style 檢索 java對象 有一個 cto build resources 模型 mybaits簡單介紹  MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。 MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以

Amazon DynamoDB系列---初識Amazon DynamoDB

什麼是 DynamoDB Amazon DynamoDB 是一種完全託管的 NoSQL 資料庫服務,提供快速而可預測的效能,能夠實現無縫擴充套件。使用 DynamoDB,您可以免除操作和擴充套件分散式資料庫的管理工作負擔,因而無需擔心硬體預置、設定和配置、複製、軟體修補或叢集擴充套

Elasticsearch 系列文章彙總(持續更新...)

Query DSL Query DSL 概要,MatchAllQuery,全文查詢簡述 Match Query Match Phrase Query 和 Match Phrase Prefix Query Java Rest Client API Elasticsearch Ja