ElasticSearch部分四--Mapping

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

你可能感兴趣的:(ElasticSearch部分四--Mapping)