一、创建客户端
1、使用java通过编码的方式创建客户端
elasticsearch客户端是java操作elasticsearch的核心对象所有的操作例如创建索引,添加索引,删除索引等操作均有该对象的api执行
//配置设置文件
Settings settings = Settings.settingsBuilder().put("client.transport.sniff", true)
.put("client.transport.ping_timeout", ping_timeout, TimeUnit.SECONDS)
.put("client.transport.nodes_sampler_interval", nodes_sampler_interval,
TimeUnit.SECONDS)
.put("cluster.name", Cluster_Name).build();
//通过设置文件settings创建elasticsearch的Client客户端elasticsearchClient = TransportClient.builder().settings(settings).build();
//为其添加与elasticsearch进行沟通的端口好。直接与elasticsearch服务打交道的默认端口为9200,使用客户端通信的端口号为9300
((TransportClient) elasticsearchClient).addTransportAddress(
new InetSocketTransportAddress(new InetSocketAddress(ES_HOST, ES_TCP_PORT)));
二、添加索引操作
1、添加单个索引
IndexRequestBuilder进行索引添加的核心对象,创建该对应时为其制定索引名Index、类型名Type,文档字段的id,在其中设置添加为索引的字段,该对象创建成果
//创建索引
IndexRequestBuilder prepareIndex = esClient.prepareIndex(indexConfiguration.getIndexName(), indexConfiguration.getIndexType(),
Long.toString(message.getEsId()));
//核心思路是根据xml的文件将数据索引进入
XContentBuilder mapping = XContentFactory.jsonBuilder();
mapping.startObject(); //填充field开始
Map filedCfg = indexConfiguration.getFieldCfg();
Map map = JSONUtils.toMap(message);
for(Map.Entry entry:map.entrySet()){
String key = entry.getKey();
if(filedCfg.containsKey(key)){
String source = filedCfg.get(key).getSource();
Object obj = map.get(source);
//添加字段
mapping.field(source,obj);
}
}
mapping.endObject(); //填充field结束
prepareIndex.setSource(mapping);
prepareIndex.execute().actionGet();
return prepareIndex;
2、批量添加索引
批量添加索引使用BulkRequestBuilder对象,还使用了线程池
可以一次将多个IndexRequestBuilder 进行添加,添加的时候为了性能更好可以关闭刷新操作。
//1、创建批量处理请求
BulkRequestBuilder bulkrequest = esClient.prepareBulk().setRefresh(true);
IndexConfiguration indexConfiguration = parseXmlByXMlConfigure();
//2、性能调优(批量处理时 刷新时间的设置,结束后恢复设置)
eSHelp.beginBulkOperation(parseXmlByXMlConfigure());
//创建线程池操作
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(200,
200, Constants.ES.REBUILD.KEEPALIVETIME, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue(20), new ThreadPoolExecutor.CallerRunsPolicy());
//批量更新的数目大小
AtomicLong counter = new AtomicLong();
//使用多线程进行批量处理
long startTime = System.currentTimeMillis();
//3、创建 IndexRequestBuilder对对象进行索引 并添加到批量处理请求中
List list = getList();
for(UserMessage message :list){
//构造需要添加的索引
IndexRequestBuilder indexRequestBuilder = addIndexRequestBuilder(message,indexConfiguration);
bulkrequest.add(indexRequestBuilder);
//4、使用线程池进行处理
if(bulkrequest.numberOfActions()>=200){
threadPool.execute(new ESHelp.BulkRequestTask(bulkrequest, counter, list.size(), startTime));
//重新构造新的批量请求
bulkrequest = esClient.prepareBulk();
}
}
//将剩余的信息进行执行
if(bulkrequest.numberOfActions()>0){
threadPool.execute(new ESHelp.BulkRequestTask(bulkrequest, counter, list.size(), startTime));
//重新构造新的批量请求
bulkrequest = esClient.prepareBulk();
}
threadPool.shutdown();
threadPool.awaitTermination(24, TimeUnit.HOURS);
eSHelp.endBulkOperation(parseXmlByXMlConfigure());
System.out.println("批量操作的执行次数为:"+counter.get());
三、搜索操作
搜索操作是其中最重要也是最复杂的操作,核心类SearchRequestBuilder,通过其构造各种查询下类型去进行搜索,其中具体的查询接口为QueryBuilder, elasticsearch提供了QueryBuilders来构造丰富的QueryBuilder对象进行查询。查询可以进行分页,高亮等操作。
IndexConfiguration indexConfiguration = parseXmlByXMlConfigure();
int pageNumer = 10; //页码
int pageSize = 20; //每页显示数量
//构造查询参数
SearchRequestBuilder searchRequestBuilder = esClient.prepareSearch(indexConfiguration.getIndexName())
.setTypes(indexConfiguration.getIndexType()).setSearchType(SearchType.QUERY_THEN_FETCH)
.setExplain(false).setFrom((pageNumer - 1) * pageSize).setSize(pageSize);
//匹配查询
//QueryBuilder query = new MatchQueryBuilder("message", "在人间");
//多字段查询
//QueryBuilder query = new MultiMatchQueryBuilder("炼狱", "message");
//词项查询 默认使用的分词器是单字分词
QueryBuilder query = new TermQueryBuilder("message", "活");
searchRequestBuilder.setQuery(query);
SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
List messages = ESUtils.recallSearchResult(searchResponse, UserMessage.class);
System.out.println("长度:"+messages.size());
System.out.println(JSON.toJSON(messages));
//QueryBuilders 提供了丰富的API 使得编程人员可以很容易的构造出各种查询,去查询数据信息
四、删除操作
1、删除单个记录
删除记录需要构建DeleteRequestBuilder对象,并制定对应的记录id进行删除,代码如下:
IndexConfiguration indexConfiguration = parseXmlByXMlConfigure();
//根据id删除document对象
DeleteRequestBuilder drb = esClient.prepareDelete(indexConfiguration.getIndexName(),
indexConfiguration.getIndexType(), String.valueOf(9999));
DeleteResponse dr = drb.execute().actionGet();
2、删除多个记录
类似于批量添加索引,也是需要使用BulkRequestBuilder对象将多个DeleteRequestBuilder 添加进入,并通过线程池进行并行处理。代码如下:
1、创建批量处理请求删除索引操作
BulkRequestBuilder bulkrequest = esClient.prepareBulk().setRefresh(true);
IndexConfiguration indexConfiguration = parseXmlByXMlConfigure();
2、性能调优(批量处理时 刷新时间的设置,结束后恢复设置)
eSHelp.beginBulkOperation(parseXmlByXMlConfigure());
//创建线程池操作
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(200,
200, Constants.ES.REBUILD.KEEPALIVETIME, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue(20), new ThreadPoolExecutor.CallerRunsPolicy());
//批量更新的数目大小
AtomicLong counter = new AtomicLong();
//使用多线程进行批量处理
long startTime = System.currentTimeMillis();
3、创建 IndexRequestBuilder对对象进行索引 并添加到批量处理请求中
List list = getList();
for(UserMessage message :list){
//构造属性
DeleteRequestBuilder deleteRequestBuilder = esClient.prepareDelete(indexConfiguration.getIndexName(),
indexConfiguration.getIndexType(), String.valueOf(message.getEsId()));
bulkrequest.add(deleteRequestBuilder);
//4、使用线程池进行处理
if(bulkrequest.numberOfActions()>=200){
threadPool.execute(new ESHelp.BulkRequestTask(bulkrequest, counter, list.size(), startTime));
//重新构造新的批量请求
bulkrequest = esClient.prepareBulk();
}
}
//将剩余的信息进行执行
if(bulkrequest.numberOfActions()>0){
threadPool.execute(new ESHelp.BulkRequestTask(bulkrequest, counter, list.size(), startTime));
//重新构造新的批量请求
bulkrequest = esClient.prepareBulk();
}
threadPool.shutdown();
threadPool.awaitTermination(24, TimeUnit.HOURS);
eSHelp.endBulkOperation(parseXmlByXMlConfigure());
System.out.println("批量操作的执行次数为:"+counter.get());