使用javaAPI来操作elasticsearch

一、创建客户端

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());

你可能感兴趣的:(全文检索)