看惯了很多Restful方式的ElasticSearch操作,总是感觉不爽,怎么说还是要代码吗,实践应用的时候不管索引还是查询都可能或多或少离不开代码。下面来说说ES的java API操作,当然其他语言的也不是不可以,既然ES支持restful.
ElasticSearch POM.xml
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.1.1</version>
</dependency>
下面简单直接粗暴上代码:
package com.test.index;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.node.NodeBuilder;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TestElasticSearch {
public ObjectMapper mapper = new ObjectMapper();
public Client client = null;
TestElasticSearch(){
try {
NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder();
// Map<String, String> settingMap = new HashMap<String, String>();
// settingMap.put("node.client", "false");
// settingMap.put("node.data", "true");
// settingMap.put("node.local", "true");
// Settings ss = Settings.builder().put(settingMap).build();
// NodeBuilder nodeBuilder2 = NodeBuilder.nodeBuilder().settings(ss); 可以通过多种方式获得client
//Node node = nodeBuilder.node();
//Client client = node.client();
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "myClusterName").build();
Client client3 = TransportClient.builder().settings(settings).build();
client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
//.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
public void index() throws Exception {
IndexResponse response = null;
/* 通过多种方式形成json字符串
client.prepareIndex("twitter", "tweet", "1")
.setSource(XContentFactory.jsonBuilder().startObject()
.field("user", "kimchy")
.field("postDate", new Date())
.field("message", "trying out Elasticsearch").endObject())
.get();
*/
User student = new User(1, 18, "zhang san", "SZ");
String jsonValue = mapper.writeValueAsString(student);
response = client.prepareIndex("user_index", "user_info", "user_1").setSource(jsonValue).execute()
.actionGet();
String _index = response.getIndex();
String _type = response.getType();// Type name
String _id = response.getId();// Document ID (generated or not)
long _version = response.getVersion();// Version (if it's the first time you index this document, you will get: 1)
boolean created = response.isCreated();// isCreated() is true if the document is a new one, false if it has been updated
System.out.println(_index+","+_type+","+_id+","+created);
//node.close();
}
public void delDoc(){
DeleteResponse delResponse = client.prepareDelete("twitter", "tweet", "1").get();
}
/** 除了下面的方式update,还可以通过下面方式来
* update by script
* upsert
* */
public void updateDoc() throws Exception{
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index("index");
updateRequest.type("type");
updateRequest.id("1");
updateRequest.doc(XContentFactory.jsonBuilder()
.startObject()
.field("gender", "male")
.endObject());
client.update(updateRequest).get();
client.prepareUpdate("ttl", "doc", "1")
.setDoc(XContentFactory.jsonBuilder()
.startObject()
.field("gender", "male")
.endObject())
.get();
}
//批处理操作
public void bulk() throws Exception{
BulkRequestBuilder bulkRequest = client.prepareBulk();
// either use client#prepare, or use Requests# to directly build index/delete requests
bulkRequest.add(client.prepareIndex("twitter", "tweet", "1")
.setSource(XContentFactory.jsonBuilder()
.startObject()
.field("user", "kimchy")
.field("postDate", new Date())
.field("message", "trying out Elasticsearch")
.endObject()
)
);
bulkRequest.add(client.prepareIndex("twitter", "tweet", "2")
.setSource(XContentFactory.jsonBuilder()
.startObject()
.field("user", "tom")
.field("postDate", new Date())
.field("message", "another post")
.endObject()
)
);
BulkResponse bulkResponse = bulkRequest.get();
if (bulkResponse.hasFailures()) {
// process failures by iterating through each bulk response item
}
System.out.println("end bulk");
}
public void query(){
SearchResponse response = client.prepareSearch("twitter")
//.setTypes("type1", "type2")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.termQuery("message", "post")) // Query
//.setPostFilter(QueryBuilders.rangeQuery("age").from(12).to(18)) // Filter
//.setFrom(0).setSize(60).setExplain(true)
.execute()
.actionGet();
System.out.println(response.toString());
}
public static void main(String[] args) {
TestElasticSearch es = new TestElasticSearch();
try {
//es.index();
es.bulk();
es.query();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class User {
private int id;
private int age;
private String name;
private String city;
//getter setter
public User(int id, int age, String name, String city) {
super();
this.id = id;
this.age = age;
this.name = name;
this.city = city;
}
}