Elasticsearch教程 elasticsearch Mapping的建立
阿新 • • 發佈:2018-12-25
一、Mapping介紹
在 Elasticsearch 中, Mapping 是什麼?
mapping 在 Elasticsearch 中的作用就是約束。
1.資料型別宣告
它類似於靜態語言中的資料型別宣告,比如宣告一個欄位為String
, 以後這個變數都只能儲存String
型別的資料。同樣的, 一個number
型別的 mapping 欄位只能儲存number
型別的資料。
2.Mapping它定義了 Type 的屬性。
"_ttl": {"enabled": false}
表示 ttl
關閉,其實ttl
預設就是關閉。
3.指定分詞器。
"id": {
"index": "not_analyzed",
"type": "string"
}
指定欄位 id
不分詞,並且型別為 string
。
二、建立Mapping
1.下面介紹一下HTTP的建立方式。我一般用Java 建立方式。
PUT http://123.123.123.123:9200/index/type/
{
"settings": {
//設定10個分片,理解為類似資料庫中的表分割槽中一個個分割槽的概念,不知道是否妥當
"number_of_shards": 10
},
"mappings": {
"trades": {
"_id": {
"path": "id"
},
"properties": {
"id": {
"type": "integer",
//id:自增數字
//要求:查詢
"store" : true
},
"name": { //名稱
"type": "string"
},
"brand": { //品牌: PG,P&G,寶潔集團,寶潔股份,聯想集團,聯想電腦等
"type": "string"
},
"orderNo": { //訂單號 :如ATTS000928732
"type": "string",
"index": "not_analyzed"
},
"description": {
//描述: 2015款玫瑰香型強生嬰兒沐浴露,550ml,包郵
"type": "string",
"sort": true
},
"date": {
"type": "date"
},
"city": {
"type": "string"
},
"qty": {// index分詞無效
"type": "float"
},
"price": {
//價格: float index無效
"type": "float"
}
}
}
}
}
上面是從其他地方抄過來的。因為我不用這種方式。
2.Java方式建立。
構建 Mapping
package com.sojson.core.elasticsearch.mapping;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import java.io.IOException;
import org.elasticsearch.common.xcontent.XContentBuilder;
public class ZhidaoMapping {
public static XContentBuilder getMapping(){
XContentBuilder mapping = null;
try {
mapping = jsonBuilder()
.startObject()
//開啟倒計時功能
.startObject("_ttl")
.field("enabled",false)
.endObject()
.startObject("properties")
.startObject("title")
.field("type","string")
.endObject()
.startObject("question")
.field("type","string")
.field("index","not_analyzed")
.endObject()
.startObject("answer")
.field("type","string")
.field("index","not_analyzed")
.endObject()
.startObject("category")
.field("type","string")
.field("index","not_analyzed")
.endObject()
.startObject("author")
.field("type","string")
.field("index","not_analyzed")
.endObject()
.startObject("date")
.field("type","string")
.field("index","not_analyzed")
.endObject()
.startObject("answer_author")
.field("type","string")
.field("index","not_analyzed")
.endObject()
.startObject("answer_date")
.field("type","string")
.field("index","not_analyzed")
.endObject()
.startObject("description")
.field("type","string")
.field("index","not_analyzed")
.endObject()
.startObject("keywords")
.field("type","string")
.field("index","not_analyzed")
.endObject()
.startObject("read_count")
.field("type","integer")
.field("index","not_analyzed")
.endObject()
//關聯資料
.startObject("list").field("type","object").endObject()
.endObject()
.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return mapping;
}
}
建立 Mapping
public static void createBangMapping(){
PutMappingRequest mapping = Requests.putMappingRequest(INDEX).type(TYPE).source(ZhidaoMapping.getMapping());
ESTools.client.admin().indices().putMapping(mapping).actionGet();
}
建立的時候,需要 index
已經建立才行,要不然會報錯。
//構建一個Index(索引) CreateIndexRequest request = new CreateIndexRequest(INDEX);
ESTools.client.admin().indices().create(request);
建立完畢在 Head 外掛裡檢視或者Get
請求。
http://123.123.123.123:9200/index/type/_mapping
得到的結果:
{
"zhidao_index": {
"mappings": {
"zhidao_type": {
"_ttl": {
"enabled": false
},
"properties": {
"answer": {
"type": "string",
"index": "not_analyzed"
},
"answerAuthor": {
"type": "string"
},
"answerDate": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"//這裡出現了複合型別
},
"answer_author": {
"type": "string",
"index": "not_analyzed"
},
"answer_date": {
"type": "string",
"index": "not_analyzed"
},
"author": {
"type": "string",
"index": "not_analyzed"
},
"category": {
"type": "string",
"index": "not_analyzed"
},
"date": {
"type": "string",
"index": "not_analyzed"
},
"description": {
"type": "string",
"index": "not_analyzed"
},
"id": {
"type": "string",
"index": "not_analyzed"
},
"keywords": {
"type": "string",
"index": "not_analyzed"
},
"list": {
"type": "object"
},
"question": {
"type": "string",
"index": "not_analyzed"
},
"readCount": {
"type": "long"
},
"read_count": {
"type": "integer"
},
"title": {
"type": "string"
}
}
}
}
}
}
Head外掛檢視
其實 Mapping ,你接觸 Elasticsearch 久一點也就那麼回事。我們雖然知道 Elasticsearch 有根據資料識別建立 Mapping ,但是最好是建立,並且指定分詞與否。這樣高效一點。