프로그래밍/ElasticSearch 2015. 7. 15. 21:44
elasticsearch에 인덱스를 만들때 일반 json ES query 로 만들 수 있지만 여기서는 자바로 인덱스를 생성하는 방법을 기록한다. elasticsearch에서는 쉽게 json 하이어라키를 만들어 낼 수 있도록 XcontentBuilder 클래스를 제공한다. startObject로 시작하여 field라는 항목으로 하위 노드에 추가 할 수 있다.
XContentBuilder mappings = null; 
  try {
   mappings = XContentFactory.jsonBuilder();
   mappings.startObject()
    .startObject("test_index")
     .field("dynamic","false")  // dynamic mapping 을 거부한다.
     .startObject("_all").field("enabled",false).endObject()  //모든 필드를 찾지 않도록 한다.
     .startObject("properties")  // 인덱스 내부에 필드들은 properties 아래 만들어져야한다.
       .startObject("document_title")
          .field("type", "string")
          .startObject("norms").field("enabled", false).endObject()
          .field("store", "yes")  //  인덱스에 추가하는 것 뿐 아니라 저장하여 디스플레이 가능하도록 setting
          .field("index", "analyzed")  // 해당 필드 분석하도록 한다. 
          .field("index_analyzer", "name_analyzer")   // 인덱스시에 이용하는 analyzer를 명시할 수 있다.
          .field("search_analyzer", "name_analyzer")
       .endObject()
      .startObject("name_number").field("type", "long").field("store", "yes").endObject()
      .startObject("st_number").field("type", "long").field("store", "yes").endObject()
      .startObject("type_info")
       .field("type", "nested")  // nested 항목으로 만들 수 있다. 이렇게 되면 하나의 document로 만들어지는 듯.
       .startObject("properties")
        .startObject("type_name")
         .field("type", "string")
        .endObject()
        .startObject("type_value")
         .field("type", "double")
        .endObject()
       .endObject()
      .endObject()
     .endObject()
    .endObject()
   .endObject();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
  XContentBuilder indexSettings = null; 
  try {
   indexSettings = XContentFactory.jsonBuilder(); 
   indexSettings.startObject()
       .field("index.number_of_shards", 3)   // 샤드 갯수 지정
       .field("index.number_of_replicas", 3)  // 레플리카 갯수 지정
//       .field("index.store.type", "memory")  // 메모리에 인덱스 데이터 저장 할 지 
       .endObject();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
  CreateIndexRequestBuilder indexCreateRequest = client.admin().indices().prepareCreate(indexName)
    .addMapping("test_index", mappings)  // 메핑 json 데이터를 인덱스 네임파라미터와 함께 setting
    .setSettings(indexSettings);  // index setting 에 관한 정보는 setsettings라는 함수로 만듬
  try{
   indexCreateRequest.execute().actionGet();
  }catch(Exception e){
   e.printStackTrace();
  }
//