我试图或多或少地使用Java API 重新创建此示例。
我认为我所需要的只是向索引添加映射,但是Java API文档尚不清楚如何执行此操作。
请告诉我如何用Java创建映射,该映射与文档中的示例等效:
curl -X PUT localhost:9200/test/tweet/_mapping -d '{ "tweet" : { "_ttl" : { "enabled" : true, "default" : "1d" } } }'
这是我的代码:
package foo; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import java.io.IOException; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequestBuilder; import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse; import org.elasticsearch.action.get.GetRequestBuilder; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; public class MyTestClass { private static Client getClient() { ImmutableSettings.Builder settings = ImmutableSettings.settingsBuilder(); TransportClient transportClient = new TransportClient(settings); transportClient = transportClient.addTransportAddress(new InetSocketTransportAddress("localhost", 9300)); return (Client) transportClient; } public static void main(String[] args) throws IOException, InterruptedException { final Client client = getClient(); // Create Index and set settings and mappings final String indexName = "test"; final String documentType = "tweet"; final String documentId = "1"; final String fieldName = "foo"; final String value = "bar"; IndicesExistsResponse res = client.admin().indices().prepareExists(indexName).execute().actionGet(); if (res.isExists()) { DeleteIndexRequestBuilder delIdx = client.admin().indices().prepareDelete(indexName); delIdx.execute().actionGet(); } CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(indexName); // MAPPING GOES HERE // createIndexRequestBuilder.addMapping(documentType, WHATEVER THE MAPPING IS); // MAPPING DONE createIndexRequestBuilder.execute().actionGet(); // Add documents IndexRequestBuilder indexRequestBuilder = client.prepareIndex(indexName, documentType, documentId); // build json object XContentBuilder contentBuilder = jsonBuilder().startObject().prettyPrint(); contentBuilder.field(fieldName, value); indexRequestBuilder.setSource(contentBuilder); indexRequestBuilder.execute().actionGet(); // Get document System.out.println(getValue(client, indexName, documentType, documentId, fieldName)); Thread.sleep(10000L); // Try again System.out.println(getValue(client, indexName, documentType, documentId, fieldName)); } protected static String getValue(final Client client, final String indexName, final String documentType, final String documentId, final String fieldName) { GetRequestBuilder getRequestBuilder = client.prepareGet(indexName, documentType, documentId); getRequestBuilder.setFields(new String[] { fieldName }); GetResponse response2 = getRequestBuilder.execute().actionGet(); String name = response2.getField(fieldName).getValue().toString(); return name; } }
终于,经过一天的谷歌搜索获得了回报。坦率地说,用于Elasticsearch的Java API文档可以使用一些端到端示例,更不用说JavaDoc …
这是一个正在运行的示例。您必须在本地主机上运行一个节点,才能正常工作!
package foo; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import java.io.IOException; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequestBuilder; import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse; import org.elasticsearch.action.get.GetRequestBuilder; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; public class MyTestClass { private static final String ID_NOT_FOUND = "<ID NOT FOUND>"; private static Client getClient() { final ImmutableSettings.Builder settings = ImmutableSettings.settingsBuilder(); TransportClient transportClient = new TransportClient(settings); transportClient = transportClient.addTransportAddress(new InetSocketTransportAddress("localhost", 9300)); return transportClient; } public static void main(final String[] args) throws IOException, InterruptedException { final Client client = getClient(); // Create Index and set settings and mappings final String indexName = "test"; final String documentType = "tweet"; final String documentId = "1"; final String fieldName = "foo"; final String value = "bar"; final IndicesExistsResponse res = client.admin().indices().prepareExists(indexName).execute().actionGet(); if (res.isExists()) { final DeleteIndexRequestBuilder delIdx = client.admin().indices().prepareDelete(indexName); delIdx.execute().actionGet(); } final CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(indexName); // MAPPING GOES HERE final XContentBuilder mappingBuilder = jsonBuilder().startObject().startObject(documentType) .startObject("_ttl").field("enabled", "true").field("default", "1s").endObject().endObject() .endObject(); System.out.println(mappingBuilder.string()); createIndexRequestBuilder.addMapping(documentType, mappingBuilder); // MAPPING DONE createIndexRequestBuilder.execute().actionGet(); // Add documents final IndexRequestBuilder indexRequestBuilder = client.prepareIndex(indexName, documentType, documentId); // build json object final XContentBuilder contentBuilder = jsonBuilder().startObject().prettyPrint(); contentBuilder.field(fieldName, value); indexRequestBuilder.setSource(contentBuilder); indexRequestBuilder.execute().actionGet(); // Get document System.out.println(getValue(client, indexName, documentType, documentId, fieldName)); int idx = 0; while (true) { Thread.sleep(10000L); idx++; System.out.println(idx * 10 + " seconds passed"); final String name = getValue(client, indexName, documentType, documentId, fieldName); if (ID_NOT_FOUND.equals(name)) { break; } else { // Try again System.out.println(name); } } System.out.println("Document was garbage collected"); } protected static String getValue(final Client client, final String indexName, final String documentType, final String documentId, final String fieldName) { final GetRequestBuilder getRequestBuilder = client.prepareGet(indexName, documentType, documentId); getRequestBuilder.setFields(new String[] { fieldName }); final GetResponse response2 = getRequestBuilder.execute().actionGet(); if (response2.isExists()) { final String name = response2.getField(fieldName).getValue().toString(); return name; } else { return ID_NOT_FOUND; } } }