相當于數據庫的表結構的定義,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 * 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();