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'