package cn.itsource;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequestBuilder;
import org.elasticsearch.action.get.GetRequestBuilder;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequestBuilder;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* crud:
* prepareIndex add
* prepareGet get
* prepareUpdate update
* prepareDelete del
*/
public class EsTest {
//索引库
private static final String INDEX = "hrm";
//索引类型
private static final String TYPE = "employee";
// @Test
public TransportClient getClient() throws Exception{
// 创建配置对象Settings,并配置嗅探模式
Settings settings = Settings.builder()
.put("client.transport.sniff", true)
.build();
// 创建传输客户端,并且指定一个ip和端
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
//使用客户端操作
// System.out.println(client);
//关闭客户端
// client.close();
return client;
}
//add
@Test
public void add() throws Exception{
//获取传输客户端
TransportClient client = getClient();
//操作
//1 创建“创建文档的请求构建器”
IndexRequestBuilder builder = client.prepareIndex(INDEX, TYPE, "1");
//2 设置文档数据
Map<String,Object> source = new HashMap<>();
source.put("id",1L);
source.put("name","yaosang");
source.put("age",18);
builder.setSource(source);
//3 发请求-get请求方式发过去
IndexResponse response = builder.get();
System.out.println(response);
//关闭
client.close();
}
//getOne
@Test
public void testGetOne() throws Exception{
//获取客户端
TransportClient client = getClient();
//获取请求构建起
GetRequestBuilder builder = client.prepareGet(INDEX, TYPE, "1");
//发请求
GetResponse response = builder.get();
System.out.println(response.getSource());
//关闭客户端
client.close();
}
//update
@Test
public void testUpdate() throws Exception{
//获取客户端
TransportClient client = getClient();
//获取请求构建器 修改=先删除添加 局部更新(prepareUpdate)
UpdateRequestBuilder builder = client.prepareUpdate(INDEX, TYPE, "1");
Map<String,Object> source = new HashMap<>();
source.put("id",1L);
source.put("age",28);
builder.setDoc(source);
//发请求
builder.get();
//关闭客户端
client.close();
}
//del
@Test
public void testDel() throws Exception{
//获取客户端
TransportClient client = getClient();
//获取请求构建器
DeleteRequestBuilder builder = client.prepareDelete(INDEX, TYPE, "1");
//发请求
builder.get();
//关闭客户端
client.close();
}
//批量操作 添加 删除 获取
@Test
public void testBulkAdd() throws Exception{
//获取客户端
TransportClient client = getClient();
//创建批量操作构建器
BulkRequestBuilder bulkBuilder = client.prepareBulk();
//添加批量请求
for (long i = 1; i <= 100; i++) {
Map<String,Object> source = new HashMap<>();
source.put("id",i);
source.put("name","yao sang"+i);
source.put("age",18+i);
IndexRequestBuilder addBuilder = client.prepareIndex(INDEX, TYPE, i + "");
addBuilder.setSource(source);
bulkBuilder.add(addBuilder);
}
//请批量操作请求
BulkResponse response = bulkBuilder.get();
if (response.hasFailures()){
System.out.println(response.buildFailureMessage());
}
//关闭客户端
client.close();
}
//dsl=查询+过滤
/**
* {
"query": {
"bool": { //booleanQuery 组合查询
"must": [ //查询 与(must) 或(should) 非(must not)
{
"match": {//标准查询(分词匹配) term:单词查询(部分词)
"description": "hello java"
}
}
],
"filter": { //过滤
"term": {"description": "hello world"}
}
}
},
* @throws Exception select name,age from t_user where name like %zs% order by id desc limit 1,10
*/
@Test
public void testDsl() throws Exception{
//获取搜索构建器
TransportClient client = getClient();
SearchRequestBuilder builder = client.prepareSearch(INDEX);
builder.setTypes(TYPE);
//构建查询条件和过滤条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //query bool
List<QueryBuilder> must = boolQueryBuilder.must();
must.add(QueryBuilders.matchQuery("name","yao")); //query bool must match
List<QueryBuilder> filter = boolQueryBuilder.filter();
filter.add(QueryBuilders.rangeQuery("age").gte(50).lte(100)); //query bool filter range
builder.setQuery(boolQueryBuilder);
//排序
builder.addSort("age", SortOrder.ASC);
//分页
builder.setFrom(10).setSize(10);
//截取字段
builder.setFetchSource(new String[]{"id","age"},null);
//查询并获取响应结果
SearchResponse response = builder.get();
//从响应对象中获取数据 total datas
SearchHits hits = response.getHits();
long totalHits = hits.getTotalHits(); //查询到总数
System.out.println("总数:"+totalHits);
SearchHit[] hitsHits = hits.getHits(); //查到数据
for (SearchHit hitsHit : hitsHits) {
// System.out.println("排名分数:"+hitsHit.getScore());
System.out.println("文档数据:"+hitsHit.getSource());
}
//关闭客户端
client.close();
}
}