2013-06-25 20 views
6

Nie mogę zmienić mapowania. Czy ktoś może mi pomóc znaleźć błąd w moim kodzie?
Znalazłem ten standardowy sposób zmiany mapowania zgodnie z kilkoma samouczkami. Ale kiedy próbuję wywołać strukturę mapowania, po utworzeniu mapowania manuall pojawia się pusta struktura mapowania.
Po wstawieniu niektórych danych pojawia się specyfikacja odwzorowania, ponieważ ES używa oczywiście domyślnej. Aby być bardziej szczegółowym, patrz poniższy kod.Elasticsearch: dodawanie ręcznego mapowania za pomocą 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(); 
} 
} 

Chcę tylko zmienić właściwość pola ATTR1, aby zapewnić szybkie zapytania. Co robię źle? Próbowałem również utworzyć mapowanie po utworzeniu indeksu, ale prowadzi to do tego samego wpływu.

Odpowiedz

5

Ok znalazłem odpowiedź własnoręcznie. Na poziomie typu musiałem zawijać "właściwości" z nazwą typu. Np:

"Type1": { "Właściwości": { ..... } }

Zobacz następujący kod:

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; 
} 

tworzy mapowania atrybutów dla attr1 - ATTR4. Teraz możliwe jest dynamiczne definiowanie mapowania dla Przykładu listy różnych atrybutów. Mam nadzieję, że pomaga komuś innemu.

Powiązane problemy