elasticsearch(一):JAVA api操作
1.创建一个mavan项目,项目的以来配置如下。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.es</groupId> <artifactId>es-test</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>6.3.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> </dependency> </dependencies> </project>
2.建立连接elasticsearch的工具类。
package com.util;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
public class ESUtils {
public static final String INDEX_NAME="userindex";
public static String getIndexName(){
return INDEX_NAME;
}
public static final String TYPE_NAME="tweet";
public static String getTypeName(){
return TYPE_NAME;
}
public static Client getClient(){
Settings settings = Settings.builder()
//指定集群名称
.put("cluster.name","my-application")
//探测集群中机器状态
.put("client.transport.sniff",true).build();
//创建客户端
Client client = null;
try {
client = new PreBuiltTransportClient(settings).addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9300));
} catch (UnknownHostException e) {
e.printStackTrace();
}
return client;
}
public static void closeClient(Client client){
if(null != client){
client.close();
}
}
}
3.创建索引
/** * 创建索引 * 如果创建的索引名称已经存在,创建会抛出异常,因此先查询要创建的索引是否已存在,不存在在创建 */ @Test public void testCreate(){ //待创建的索引名称 String indexName = "userindex"; //获取连接 Client client = ESUtils.getClient(); //判断索引是否存在 IndicesExistsRequest existsRequest = new IndicesExistsRequest(indexName); IndicesExistsResponse existsResponse = client.admin().indices().exists(existsRequest).actionGet(); if(!existsResponse.isExists()){ //创建索引 CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName); CreateIndexResponse createIndexResponse = client.admin().indices().create(createIndexRequest).actionGet(); //判断创建是否成功 if (createIndexResponse.isAcknowledged()){ logger.info("创建成功"); }else{ logger.info("创建失败"); } }else { logger.info("索引已存在,无法创建"); } //关闭连接 ESUtils.closeClient(client); }
4.向索引添加数据
/** * 向索引中逐条加入数据 */ @Test public void add(){ //获取连接 Client client = ESUtils.getClient(); //待添加的json数据 String strJson ="{\"age\":25,\"name\":\"张三\",\"weight\":76,\"married\":true}"; XContentParser parser = null; try { //数据解析,因为不支持json和对象类型的数据,要将其转为map parser = XContentFactory.xContent(XContentType.JSON).createParser(NamedXContentRegistry.EMPTY,DeprecationHandler.THROW_UNSUPPORTED_OPERATION,strJson); //插入数据 IndexResponse indexResponse = client.prepareIndex().setIndex(ESUtils.getIndexName()) .setType(ESUtils.getTypeName()) .setSource(parser.map()) //设置数据的id,id唯一,如果id已存在则是修改 .setId("2") .execute() .actionGet(); logger.info("添加成功,"+indexResponse.status());
} catch (IOException e) {
e.printStackTrace();
}finally {
ESUtils.closeClient(client);
}
}
5.修改数据
/** * 更新数据 */ @Test public void update(){ Client client = ESUtils.getClient(); Map<String,Object> map = new HashMap<String, Object>(); map.put("age",56); map.put("name","李四"); map.put("weight",69); map.put("married",false); UpdateResponse updateResponse = client.prepareUpdate() .setIndex(ESUtils.getIndexName()) .setType(ESUtils.getTypeName()) .setDoc(map) //要更新的数据的id .setId("2").execute().actionGet(); logger.info("更新成功,"+updateResponse.status()); ESUtils.closeClient(client); }
6.删除数据
/** * 根据id删除数据 */ @Test public void delete(){ //获取连接 Client client = ESUtils.getClient(); //删除数据 DeleteResponse deleteResponse = client.prepareDelete() .setIndex(ESUtils.getIndexName()) .setType(ESUtils.getTypeName()) //设置id .setId("1") .execute().actionGet(); logger.info("删除成功,"+deleteResponse.status()); //关闭连接 ESUtils.closeClient(client); }
7.根据id查询数据
/** * 根据id查询数据 */ @Test public void select(){ //获取连接 Client client = ESUtils.getClient(); //查询数据 GetResponse getResponse = client.prepareGet() .setIndex(ESUtils.getIndexName()) .setType(ESUtils.getTypeName()) .setId("1") .execute().actionGet(); //数据 logger.info("data:="+getResponse.getSourceAsString()); //关闭连接 ESUtils.closeClient(client); }
8.全文查询
/** * 全文检索数据 */ @Test public void search(){ //获取连接 Client client = ESUtils.getClient(); //设置查询条件 QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("ipad"); //查询 SearchResponse response = client.prepareSearch(ESUtils.getIndexName()) .setQuery(queryBuilder) //设置分页 .setFrom(0).setSize(60) .execute().actionGet(); //获取查询结果 SearchHits shs = response.getHits(); logger.info("查询数据条数:"+shs.getTotalHits()); for (SearchHit hit:shs.getHits()) { logger.info(hit.getSourceAsString()); } //关闭连接 ESUtils.closeClient(client); }
9.批量插入数据
//批量插入数据 @Test public void testBulk(){ //获取连接 Client client = ESUtils.getClient(); //批量接口 BulkRequestBuilder bulkRequestBuilder = client.prepareBulk(); User user = new User(); //设置对象的属性 for (int i=3;i<40002;i++){ user.setName("user_"+UUID.randomUUID().toString().replace("-","").substring(0,6)); SecureRandom random = new SecureRandom(); long l = Math.abs(random.nextLong()); user.setWeight(l); user.setMarried(l%3==0?true:false); user.setAge(l%2==0?28:82); //将对象转为json字符串 Gson gson = new Gson(); String json = gson.toJson(user); XContentParser parser = null; //数据转换 try { parser = XContentFactory.xContent(XContentType.JSON).createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, json); } catch (IOException e) { e.printStackTrace(); } IndexRequestBuilder ir = null; //预插入数据 try { ir = client.prepareIndex("userindex","tweet",String.valueOf(i)).setSource(parser.map()); } catch (IOException e) { e.printStackTrace(); } bulkRequestBuilder.add(ir); } //批量插入 BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet(); //判断插入是否失败 if(bulkResponse.hasFailures()){ //失败原因 logger.info(bulkResponse.buildFailureMessage()); logger.info("失败"); } }
10.按指定条件查询
/** * 按指定属性查询 */ @Test public void testSearchByFiled(){ //获取连接 Client client = ESUtils.getClient(); //查询过滤器 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //查询条件 查询字段名称 和 值 boolQueryBuilder.must(QueryBuilders.termQuery("age",28)); boolQueryBuilder.must(QueryBuilders.termQuery("married",true)); //知道要查询的索引和type SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ESUtils.getIndexName()).setTypes(ESUtils.getTypeName()); //设置查询的分页 searchRequestBuilder.setQuery(boolQueryBuilder).setFrom(0).setSize(10000); //执行查询 SearchResponse response = searchRequestBuilder.execute().actionGet(); //查询结果数 logger.info("数据总数:"+response.getHits().totalHits); //变量查询结果集 for (SearchHit hit:response.getHits()) { logger.info(hit.getSourceAsString()); } //关闭连接 ESUtils.closeClient(client); }
11.聚合数据
/** * 按指定条件聚合数据(分类统计) */ @Test public void testFacets(){ //获取连接 Client client = ESUtils.getClient(); //设置待查询的索引和类型 SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ESUtils .getIndexName()).setTypes(ESUtils.getTypeName()); //设置查询条件 TermsAggregationBuilder builder = AggregationBuilders //查询结果集名称 .terms("marry") //要查询的属性名称 .field("age"); searchRequestBuilder.addAggregation(builder); //执行查询 SearchResponse response = searchRequestBuilder.execute().actionGet(); //根据设置的名字获取查询结果 Terms terms = response.getAggregations().get("marry"); List<? extends Terms.Bucket> buckets = terms.getBuckets(); Map<String,String> map = new HashMap<String, String>(); //聚合统计数量 for (Terms.Bucket bucket :buckets){ String key = bucket.getKeyAsString(); map.put(key,bucket.getDocCount()+""); } //输出查询数量 for (Map.Entry<String,String> entry : map.entrySet()){ logger.info(entry.getKey()+":"+entry.getValue()); } //关闭连接 ESUtils.closeClient(client); }
12.删除索引
/** * 删除索引 */ @Test public void testDelete(){ //获取连接 Client client = ESUtils.getClient(); //判断索引是否存在 IndicesExistsRequest existsRequest = new IndicesExistsRequest(ESUtils.getIndexName()); IndicesExistsResponse existsResponse = client.admin().indices().exists(existsRequest).actionGet(); if(existsResponse.isExists()){ //删除 DeleteIndexResponse deleteIndexResponse = client.admin().indices().prepareDelete(ESUtils.getIndexName()).execute().actionGet(); if(deleteIndexResponse.isAcknowledged()){ logger.info("删除成功"); }else{ logger.info("删除失败"); } }else { logger.info("索引 "+ESUtils.getIndexName()+" 不存在"); } //关闭连接 ESUtils.closeClient(client); }