2013-06-25 1 views
6

매핑을 변경할 수 없습니다. 아무도 내 코드에서 버그를 찾도록 도와 줄 수 있습니까?
나는이 튜토리얼에 따라 맵핑을 변경하는 표준 방법을 발견했다. 하지만 매핑 구조를 호출하려고 할 때 제작 매핑 생성 후에 빈 매핑 구조가 나타납니다.
그러나 일부 데이터를 삽입 한 후에도 ES가 물론 기본값을 사용하기 때문에 매핑 사양이 나타납니다. 더 자세한 내용은 아래 코드를 참조하십시오.탄성 검색 : Java를 사용하여 수동 매핑 추가

public class ElasticTest { 
private String dbname = "ElasticSearch"; 
private String index = "indextest"; 
private String type = "table"; 
private Client client = null; 
private Node node = null; 

public ElasticTest(){ 
    this.node = nodeBuilder().local(true).node(); 
    this.client = node.client(); 

    if(isIndexExist(index)){ 
     deleteIndex(this.client, index); 
     createIndex(index); 
    } 
    else{ 
     createIndex(index); 
    } 

    System.out.println("mapping structure before data insertion"); 
    getMappings(); 
    System.out.println("----------------------------------------"); 
    createData(); 
    System.out.println("mapping structure after data insertion"); 
    getMappings(); 



} 

public void getMappings() { 
    ClusterState clusterState = client.admin().cluster().prepareState() 
      .setFilterIndices(index).execute().actionGet().getState(); 
    IndexMetaData inMetaData = clusterState.getMetaData().index(index); 
    MappingMetaData metad = inMetaData.mapping(type); 

    if (metad != null) { 
     try { 
      String structure = metad.getSourceAsMap().toString(); 
      System.out.println(structure); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

private void createIndex(String index) { 
    XContentBuilder typemapping = buildJsonMappings(); 
    String mappingstring = null; 
    try { 
     mappingstring = buildJsonMappings().string(); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

    client.admin().indices().create(new CreateIndexRequest(index) 
        .mapping(type, typemapping)).actionGet(); 

    //try put mapping after index creation 
    /* 
    * PutMappingResponse response = null; try { response = 
    * client.admin().indices() .preparePutMapping(index) .setType(type) 
    * .setSource(typemapping.string()) .execute().actionGet(); } catch 
    * (ElasticSearchException e) { e.printStackTrace(); } catch 
    * (IOException e) { e.printStackTrace(); } 
    */ 

} 

private void deleteIndex(Client client, String index) { 
    try { 
     DeleteIndexResponse delete = client.admin().indices() 
       .delete(new DeleteIndexRequest(index)).actionGet(); 
     if (!delete.isAcknowledged()) { 
     } else { 
     } 
    } catch (Exception e) { 
    } 
} 

private XContentBuilder buildJsonMappings(){ 
    XContentBuilder builder = null; 
    try { 
     builder = XContentFactory.jsonBuilder(); 
     builder.startObject() 
     .startObject("properties") 
      .startObject("ATTR1") 
       .field("type", "string") 
       .field("store", "yes") 
       .field("index", "analyzed") 
      .endObject() 
      .endObject() 
     .endObject();   
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return builder; 
} 

private boolean isIndexExist(String index) { 
    ActionFuture<IndicesExistsResponse> exists = client.admin().indices() 
      .exists(new IndicesExistsRequest(index)); 
    IndicesExistsResponse actionGet = exists.actionGet(); 

    return actionGet.isExists(); 
} 

private void createData(){ 
    System.out.println("Data creation"); 
    IndexResponse response=null; 
    for (int i=0;i<10;i++){ 
     Map<String, Object> json = new HashMap<String, Object>(); 
     json.put("ATTR1", "new value" + i); 
     response = this.client.prepareIndex(index, type) 
       .setSource(json) 
       .setOperationThreaded(false) 
       .execute() 
       .actionGet(); 
    } 
    String _index = response.getIndex(); 
    String _type = response.getType(); 
    long _version = response.getVersion(); 
    System.out.println("Index : "+_index+" Type : "+_type+" Version : "+_version); 
    System.out.println("----------------------------------"); 
} 

public static void main(String[] args) 
{ 
    new ElasticTest(); 
} 
} 

빠른 쿼리를 보장하기 위해 분석 된 ATTR1 필드의 속성을 변경하고 싶습니다. 무엇이 잘못 되었나요? 인덱스 생성 후에도 매핑을 만들려고했으나 같은 결과가 나타납니다.

답변

5

나는 내 자신이 대답을 찾았습니다. 유형 레벨에서 유형 이름으로 "특성"을 래핑해야했습니다. 예 :

"타입 1":

private XContentBuilder getMappingsByJson(){ 
    XContentBuilder builder = null; 
    try { 
     builder = XContentFactory.jsonBuilder().startObject().startObject(type).startObject("properties"); 
     for(int i = 1; i<5; i++){ 
      builder.startObject("ATTR" + i) 
        .field("type", "integer") 
        .field("store", "yes") 
        .field("index", "analyzed") 
        .endObject(); 
      } 
      builder.endObject().endObject().endObject(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    return builder; 
} 

그것은 속성의 ATTR1에 대한 매핑을 만듭니다 : { "속성": { ..... } }

다음 코드를 참조하십시오 - ATTR4. 이제 여러 속성의 목록을 동적으로 매핑하는 예를 정의 할 수 있습니다. 다른 사람들을 돕기를 바랍니다.