1,前期的准备工作。
(1)测试使用的elastic search的版本是2.3.1版的,具体版本可以上官网下载,本地虚拟机配置的是3台服务器的集群。
(2)使用的jar包是2.3.5版本的。
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.3.5</version>
</dependency>
2,获取transportclient的方式,通过esIp(elastic search集群服务器IP地址,也可以只传主节点的IP地址),以及elasticClusterName(这个集群的名字是在集群安装时,在config/elasticsearch.yml 里面可以配置,配置参数为:cluster.name) 获取transportClient对象,transportClient对象应设置成单例的对象。另外transportclient是通过9300端口来和es集群进行通信的,所以在新建InetSockTransportAddress对象时,需要指定端口号为9300。
private static Byte LOCK = 1 ;
public static TransportClient getTransportClientInstance(String esIp,String elasticClusterName) throws IOException {
if (transportClient == null) {
synchronized (LOCK) {
if (transportClient == null) {
transportClient = getTransportClient(esIp,elasticClusterName);
}
}
}
return transportClient;
}
/**
* 获取ES的连接client实例;
*/
private static TransportClient getTransportClient(String esIp,String elasticClusterName) throws IOException {
Settings settings = Settings.builder()
.put("cluster.name", "testSearch")
.put("client.transport.sniff", true)
.build();
TransportClient transportClient = TransportClient.builder().settings(settings).build();
String[] ips =esIp.split(",");
for (String ip : ips) {
try {
InetSocketTransportAddress ist = new InetSocketTransportAddress(InetAddress.getByName(ip),9300);
transportClient.addTransportAddress(ist);
}catch (Exception e){
}
}
return transportClient;
}
3, 添加索引,官网上有好几种添加索引的方式,这边只介绍其中的两种。
(1)用Java代码构造一个XcontenBuilder的对象, 然后通过上面获得的transportclient来发送http请求来添加索引,其中下面的client.prepareIndex(INDEX, TYPE)方法接受两个参数INDEX和TYPE,INDEX是指索引库的名称,相当于mysql里面的数据库库名。TYPE是索引库的类型,相当于mysql数据库中的表名。
(需要注意的是,es在为一个文档创建索引的同时会为你创建好索引库的INDEX, 以及TYPE。不同于mysql,mysql中你需要先创建数据库以及数据库的表,然后你才能向相应的表中插入数据;es的话,不用提前创建好INDEX以及TYPE,你在向es添加数据的同时,INDEX和TYPE就创建完成了。)
/**
* 添加索引,结果查看 http://192.168.183.111:9200/_plugin/head/
*
*/
@Test
public void addIndex() {
TransportClient client = null;
try {
client = ESConnectFactory.getTransportClient("192.168.25.101",“esname”);
client.prepareIndex("cars", "transactions")
.setSource(jsonBuilder()
.startObject()
.field("price", 30000)
.field("color", "red")
.field("make", "benz")
.field("sold", "2014-10-25")
.endObject()
)
.get();
} catch (IOException e) {
e.printStackTrace();
}
}
(2)在linux的平台上,通过curl命令,直接发送put请求来添加索引。其中上述所说的INDEX对应下面例子中的cars, TYPE对应下面例子中的transaction,另外car/transactions/1 中的1代表创建索引指定的id=1。
curl -XPUT 'http://192.168.25.101:9200/cars/transactions/1' -d '{
"price": 30000,
"color" : "red",
"make":"benz",
"sold":"2015-10-01",
}'
4,删除索引(删除一个文档),也有两种方式
(1) 通过java代码构造一个Delete的请求。其中prepareDelete(INDEX, TYPE, ID)方法接受三个参数,分别是索引库的INDEX, TYPE以及需要删除文档的ID。
@Test
public void deleteIndex() {
TransportClient client = null;
try {
client = ESConnectFactory.getTransportClient("192.168.25.101");
DeleteResponse deleteResponse = client.prepareDelete(INDEX,TYPE,"AWGEs4y2jvUUEBNtYcCs").get();
System.out.println(deleteResponse.isFound());//return true if a doc was found to delete
} catch (IOException e) {
e.printStackTrace();
}
}
(2) 通过curl命令删除
#删除一个文档 curl -XDELETE 'http://192.168.25.101:9200/cars/transactions/AWGDE486jvUUEBNtYcCp'
5,更新索引。
(1) java代码进行更新,调用prepareUpdate(INDEX, TYPE, ID)的方法
@Test
public void prepareUpdate(){
TransportClient client = null;
try {
client = ESConnectFactory.getTransportClient("192.168.25.101");
client.prepareUpdate(INDEX, TYPE, "AWD46dWwaZGQx7zF0th7")
.setDoc(jsonBuilder()
.startObject()
.field("color", "red")
.endObject())
.get();
} catch (Exception e) {
e.printStackTrace();
}
}
(2)使用curl命令, 发送post请求
curl -XPOST 'http://172.16.0.14:9200/cars/transaction/AWD46dWwaZGQx7zF0th7/_update' -d '{
"doc": {
"color" :"red"
}
}'
6,简单的查询方法
(1)构造get请求
/**
* 通过id获取索引文档
*/
@Test
public void getDoc() {
TransportClient client = null;
try {
client = ESConnectFactory.getTransportClient("192.168.25.101");
GetResponse response = client.prepareGet(INDEX, TYPE, "AWD46PG8aZGQx7zF0th6").get();
String sourceAsString = response.getSourceAsString();
System.out.println(sourceAsString);
System.out.println(response.getSourceAsString());
} catch (IOException e) {
e.printStackTrace();
}
}
(2) 使用curl命令发送get请求
curl -XGET 'http://192.168.25.101:9200/cars/transaction/AWD46PG8aZGQx7zF0th6'
