相當於數據庫的表結構的定義,elasticsearch的mapping 也很重要。直接關繫到性能及搜索結果的準確性。elasticsearch的java api的例子太少,我在這兒就獻醜了。
爲了說明mapping的定義,我這裏定義了一個簡單的模型,就ID,type,和catIds 3個屬性,重在說明如何使用java api來定義mapping,具體各field應該如何定義,這裏不作討論。
Java代碼 收藏代碼
public class TestModel implements Serializable {
private static final long serialVersionUID = 3174577828007649745L;
//主ID
private long id;
//類型,爲types之一
private String type;
/**
* 這裏是一個列表
*/
private List<Integer> catIds;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public List<Integer> getCatIds() {
return catIds;
}
public void setCatIds(List<Integer> catIds) {
this.catIds = catIds;
}
}
我們假設id就存儲爲long類型,type存儲爲字符串類型,catIds爲一個列表,其實際類型爲integer類型。定義的mapping以下:
Java代碼 收藏代碼
/**
* mapping 一旦定義,之後就不能修改。
* @return
* @throws Exception
*/
private static XContentBuilder getMapping() throws Exception{
XContentBuilder mapping = jsonBuilder()
.startObject()
.startObject("test")
.startObject("properties")
.startObject("id")
.field("type", "long")
.field("store", "yes")
.endObject()
.startObject("type")
.field("type", "string")
.field("index", "not_analyzed")
.endObject()
.startObject("catIds")
.field("type", "integer")
.endObject()
.endObject()
.endObject()
.endObject();
return mapping;
}
注意:elasticsearch的field一旦定義後就無法修改,你想增長一個store屬性,都不行。
下面就是調用JAVA API了,注意,在定義mapping以前,還須要先創建一個index庫。這裏,我index庫和mapping 寫到一個方法裏面了。
Java代碼 收藏代碼
Client client = ESUtils.getClient();
//首先創建索引庫
CreateIndexResponse indexresponse = client.admin().indices()
//這個索引庫的名稱還必須不包含大寫字母
.prepareCreate("testindex").execute().actionGet();
System.out.println(indexresponse.acknowledged());;
//若是是在兩臺機器上,下面直接putMapping可能會報異常
PutMappingRequestBuilder builder = client.admin().indices().preparePutMapping("testindex");
//testType就像當於數據的table
builder.setType("testType");
XContentBuilder mapping = getMapping();
builder.setSource(mapping);
PutMappingResponse response = builder.execute().actionGet();
System.out.println(response.isAcknowledged());
其中,這個代碼在我本機出現一點問題,當我創建完index後,直接創建mapping 的時候,報index missing。我把兩個es Node停掉一個就沒有問題了。可見,ES將create index和putMapping放到了兩個不一樣的es Node下面,導致了上面那個異常。
好了,有時爲了測試,可能須要刪除某個索引,代碼以下:
Java代碼 收藏代碼
Client client = ESUtils.getClient();
client.admin().indices()
//這個索引庫的名稱還必須不包含大寫字母
.prepareDelete("testindex").execute().actionGet(); java