Elasticsearch: adding manual mapping using Java

I can not change the display. Can someone help me find an error in my code?
I found this standard way to change the display according to several tutorials. But when I try to call the map structure, after creating the map manuall only the empty display structure appears.
But after inserting some data, a display specification appears, because ES uses, of course, by default. To be more specific, see the code below.

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

I just want to change the property of the ATTR1 field for analysis to provide quick queries. What am I doing wrong? I also tried to create a mapping after creating the index, but this leads to the same effect.

+6
source share
1 answer

Ok, I found the answer myself. At the type level, I had to wrap the “properties” with the type name. For instance:

"type1": {"Properties": {.....}}

See the following code:

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

It creates mappings for the attributes ATTR1 - ATTR4. Now you can define a display for an example of a list of various attributes dynamically. Hope this helps someone else.

+5
source

Source: https://habr.com/ru/post/948048/


All Articles