Elastic Search——mapping

1、 什麼是mapping

PUT /myindex/article/1 
{ 
  "post_date": "2018-05-10", 
  "title": "Java", 
  "content": "java is the best language", 
  "author_id": 119
}

PUT /myindex/article/2
{ 
  "post_date": "2018-05-12", 
  "title": "html", 
  "content": "I like html", 
  "author_id": 120
}

PUT /myindex/article/3
{ 
  "post_date": "2018-05-16", 
  "title": "es", 
  "content": "Es is distributed document store", 
  "author_id": 110
}

GET /myindex/article/_search?q=2018-05

GET /myindex/article/_search?q=2018-05-10

GET /myindex/article/_search?q=html

GET /myindex/article/_search?q=java

#查看es自動創建的mapping

GET /myindex/article/_mapping

es自動創建了index,type,以及type對應的mapping(dynamic mapping)

什麼是映射:mapping定義了type中的每個字段的數據類型以及這些字段如何分詞等相關屬性

{
  "myindex": {
    "mappings": {
      "article": {
        "properties": {
          "author_id": {
            "type": "long"
          },
          "content": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "post_date": {
            "type": "date"
          },
          "title": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

創建索引的時候,可以預先定義字段的類型以及相關屬性,這樣就能夠把日期字段處理成日期,把數字字段處理成數字,把字符串字段處理字符串值等

支持的數據類型:

(1)核心數據類型(Core datatypes)

字符型:string,string類型包括
text 和 keyword

text類型被用來索引長文本,在建立索引前會將這些文本進行分詞,轉化爲詞的組合,建立索引。允許es來檢索這些詞語。text類型不能用來排序和聚合。

Keyword類型不需要進行分詞,可以被用來檢索過濾、排序和聚合。keyword 類型字段只能用本身來進行檢索

數字型:long, integer, short, byte, double, float
日期型:date
布爾型:boolean
二進制型:binary

(2)複雜數據類型(Complex datatypes)

數組類型(Array datatype):數組類型不需要專門指定數組元素的type,例如:
    字符型數組: [ "one", "two" ]
    整型數組:[ 1, 2 ]
    數組型數組:[ 1, [ 2, 3 ]] 等價於[ 1, 2, 3 ]
    對象數組:[ { "name": "Mary", "age": 12 }, { "name": "John", "age": 10 }]
對象類型(Object datatype):_ object _ 用於單個JSON對象;
嵌套類型(Nested datatype):_ nested _ 用於JSON數組;

(3)地理位置類型(Geo datatypes)

地理座標類型(Geo-point datatype):_ geo_point _ 用於經緯度座標;
地理形狀類型(Geo-Shape datatype):_ geo_shape _ 用於類似於多邊形的複雜形狀;

(4)特定類型(Specialised datatypes)

IPv4 類型(IPv4 datatype):_ ip _ 用於IPv4 地址;
Completion 類型(Completion datatype):_ completion _提供自動補全建議;
Token count 類型(Token count datatype):_ token_count _ 用於統計做了標記的字段的index數目,該值會一直增加,不會因爲過濾條件而減少。
mapper-murmur3
類型:通過插件,可以通過 _ murmur3 _ 來計算 index 的 hash 值;
附加類型(Attachment datatype):採用 mapper-attachments
插件,可支持_ attachments _ 索引,例如 Microsoft Office 格式,Open Document 格式,ePub, HTML 等。

支持的屬性:

“store”:false//是否單獨設置此字段的是否存儲而從_source字段中分離,默認是false,只能搜索,不能獲取值

“index”: true//分詞,不分詞是:false
,設置成false,字段將不會被索引

“analyzer”:“ik”//指定分詞器,默認分詞器爲standard analyzer

“boost”:1.23//字段級別的分數加權,默認值是1.0

“doc_values”:false//對not_analyzed字段,默認都是開啓,分詞字段不能使用,對排序和聚合能提升較大性能,節約內存

“fielddata”:{“format”:“disabled”}//針對分詞字段,參與排序或聚合時能提高性能,不分詞字段統一建議使用doc_value

“fields”:{“raw”:{“type”:“string”,“index”:“not_analyzed”}} //可以對一個字段提供多種索引模式,同一個字段的值,一個分詞,一個不分詞

“ignore_above”:100 //超過100個字符的文本,將會被忽略,不被索引

“include_in_all”:ture//設置是否此字段包含在_all字段中,默認是true,除非index設置成no選項

“index_options”:“docs”//4個可選參數docs(索引文檔號) ,freqs(文檔號+詞頻),positions(文檔號+詞頻+位置,通常用來距離查詢),offsets(文檔號+詞頻+位置+偏移量,通常被使用在高亮字段)分詞字段默認是position,其他的默認是docs

“norms”:{“enable”:true,“loading”:“lazy”}//分詞字段默認配置,不分詞字段:默認{“enable”:false},存儲長度因子和索引時boost,建議對需要參與評分字段使用 ,會額外增加內存消耗量

“null_value”:“NULL”//設置一些缺失字段的初始化值,只有string可以使用,分詞字段的null值也會被分詞

“position_increament_gap”:0//影響距離查詢或近似查詢,可以設置在多值字段的數據上火分詞字段上,查詢時可指定slop間隔,默認值是100

“search_analyzer”:“ik”//設置搜索時的分詞器,默認跟ananlyzer是一致的,比如index時用standard+ngram,搜索時用standard用來完成自動提示功能

“similarity”:“BM25”//默認是TF/IDF算法,指定一個字段評分策略,僅僅對字符串型和分詞類型有效

“term_vector”:“no”//默認不存儲向量信息,支持參數yes(term存儲),with_positions(term+位置),with_offsets(term+偏移量),with_positions_offsets(term+位置+偏移量) 對快速高亮fast vector highlighter能提升性能,但開啓又會加大索引體積,不適合大數據量用

映射的分類:

(1)動態映射:

當ES在文檔中碰到一個以前沒見過的字段時,它會利用動態映射來決定該字段的類型,並自動地對該字段添加映射。

可以通過dynamic設置來控制這一行爲,它能夠接受以下的選項:

true:默認值。動態添加字段
false:忽略新字段
strict:如果碰到陌生字段,拋出異常

dynamic設置可以適用在根對象上或者object類型的任意字段上。

POST /lib2

#給索引lib2創建映射類型

{
"settings":{

"number_of_shards" : 3,

"number_of_replicas" : 0

},

 "mappings":{
 
  "books":{
  
    "properties":{
    
        "title":{"type":"text"},
        "name":{"type":"text","index":false},
        "publish_date":{"type":"date","index":false},
        
        "price":{"type":"double"},
        
        "number":{"type":"integer"}
    }
  }
 }
}

POST /lib

#給索引lib創建映射類型

{

"settings":{

"number_of_shards" : 3,

"number_of_replicas" : 0

},

 "mappings":{
 
  "books":{
  
    "properties":{
    
        "title":{"type":"text"},
        "name":{"type":"text","index":false},
        "publish_date":{"type":"date","index":false},
        
        "price":{"type":"double"},
        
        "number":{
            "type":"object",
            "dynamic":true
        }
    }
  }
 }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章