2013-06-25 17 views
6

Eşleştirmeyi değiştiremiyorum. Kodumdaki hatayı bulmama yardım eden var mı?
Eşleştirmeyi çeşitli öğreticilere göre değiştirmenin bu standart yolunu buldum. Ancak haritalama yapısını aramaya çalıştığımda, manuall harita oluşturulduktan sonra sadece boş bir harita yapısı ortaya çıkıyor.
Ancak, bazı verileri ekledikten sonra eşleme belirtimi görünür çünkü ES, elbette varsayılan olanı kullanır. Daha spesifik olmak için aşağıdaki kodu inceleyin.Elasticsearch: Java kullanarak manuel eşleme ekleme

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

Sadece hızlı sorguları sağlamak için analiz etmek için ATTR1 alanının özelliğini değiştirmek istiyorum. Neyi yanlış yapıyorum? Ayrıca, dizin oluşturulduktan sonra eşlemeyi oluşturmaya çalıştım ama aynı etkiye yol açıyor.

cevap

5

Yanıtı kendi başıma buldum. Tip seviyesinde, "özellikler" i tip adıyla sarmak zorunda kaldım. Ör:

"tür1":

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

Bu nitelikler ATTR1 için eşleştirmeleri oluşturur: { "özellikleri": { ..... } }

aşağıdaki kodu Bkz - ATTR4. Şimdi, Örnek için eşlemeyi dinamik olarak farklı özniteliklerin bir listesini tanımlamak mümkündür. Umarım başkasına yardım eder.

İlgili konular