2013-06-25 13 views
6

Non posso modificare la mappatura. Qualcuno può aiutarmi a trovare il bug nel mio codice?
Ho trovato questo modo standard per modificare la mappatura in base a diversi tutorial. Ma quando cerco di chiamare la struttura di mappatura, appena appare una struttura di mappatura vuota dopo la creazione di un mapping manuale.
Ma dopo l'inserimento di alcuni dati appare la specifica di mappatura perché ES sta utilizzando ovviamente quello predefinito. Per essere più specifici vedi il codice qui sotto.Elasticsearch: aggiunta di mappatura manuale utilizzando 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(); 
} 
} 

Voglio solo modificare la proprietà del campo ATTR1 per analizzare le query veloci. Cosa sto facendo male? Ho anche provato a creare la mappatura dopo la creazione dell'indice, ma porta allo stesso effetto.

risposta

5

Ok ho trovato la risposta da sola. A livello di tipo ho dovuto racchiudere le "proprietà" con il nome del tipo. Ad esempio:

"tipo1": { "proprietà": { ..... }}

Vedere il seguente codice:

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

crea mappature per gli attributi attr1 - ATTR4. Ora è possibile definire la mappatura per esempio un elenco di attributi diversi in modo dinamico. Spero che aiuti qualcun altro.