Elasticsearch: Hinzufügen von manuellen mapping mit Java
Kann ich nicht ändern Sie die Zuordnung. Kann jemand mir helfen zu finden, den Fehler in meinem code?
Ich habe festgestellt, dass dies standard-Weg, um das mapping ändern laut mehreren tutorials. Aber wenn ich versuche zu nennen, die mapping-Struktur gibt halt, erscheint ein leeres mapping-Struktur nach dem manuellen mapping-Erstellung.
Aber nach dem einfügen einiger Daten, die dort erscheinen, wird die mapping-Spezifikation, denn ES ist mit natürlich die Standard-Einstellung. Um genauer zu sein, siehe code unten.
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();
}
}
Ich möchte nur, ändern Sie die Eigenschaft ATTR1 Feld analysiert, um schnelle Abfragen.
Was ich falsch mache? Ich habe auch versucht zu erstellen die Zuordnung nach der index-Erstellung, aber es führt zu den gleichen Auswirkungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, ich fand die Antwort von meiner eigenen. Auf der type-Ebene, musste ich wickeln Sie die "Eigenschaften" mit dem Art-Namen. E. g:
"type1" : {
"properties" : {
.....
}
}
Finden Sie den folgenden code:
Schafft es mappings für die Attribute ATTR1 - ATTR4. Es ist nun möglich zu definieren mapping zum Beispiel eine Liste von verschiedenen Parametern dynamisch. Hoffe es hilft jemand anderem.