1.客户端连接服务器
Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", 集群名称,默认是elasticsearch).build();
client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress(“elasticsearch服务器地址”, 9300));
2.监测集群状态
//得到
ClusterStateResponse csr = esHandler.getClient()
.admin().cluster().prepareState().execute().actionGet();
ClusterHealthRequest chr = new ClusterHealthRequest();
//得到集群状态 分片数量
ClusterHealthResponse chresponse = esHandler.getClient()
.admin().cluster().health(chr).actionGet();
//监测索引的状态
IndicesStatsRequest isp =new IndicesStatsRequest();
IndicesStatsResponse isr = esHandler.getClient()
.admin().indices().stats(isp).actionGet();
//集群状态
cluster.setClusterStatus(chresponse.getStatus().toString().toLowerCase());
//活动分片数量
cluster.setActiveShards(chresponse.getActiveShards());
//未知分片数量
cluster.setUnassignedShards(chresponse.getUnassignedShards());
//索引数量
cluster.setIndexNumber(csr.getState().getMetaData().getIndices().size());
//集群节点名称
cluster.setNodeNames(this.sortNode(csr.getState().getNodes()));
//节点数量
cluster.setNodeNumber(csr.getState().getNodes().size());
//集群名称
cluster.setClusterName(chresponse.getClusterName());
//文档数量
cluster.setDocCount(isr.getPrimaries().getDocs().getCount());
//数据存储大小
cluster.setStoreSize(isr.getPrimaries().getStore().getSize());
3.监测节点状态
NodesStatsRequest csr = new NodesStatsRequest(nodeNames[0]);
NodesStatsResponse response = esHandler.getClient()
.admin().cluster().nodesStats(csr.all()).actionGet();
NodeStats[] ns = response.getNodes();
List<NodeStats> list = new ArrayList<NodeStats>();
for(NodeStats nodeStats:ns){
list.add(nodeStats);
}
//(ArrayList)Arrays.asList(ns);
List<NodeState> nodeList = new ArrayList<NodeState>();
for(int i=0;i<nodeNames.length;i++){
for(int j=0;j<list.size();j++){
NodeStats nodeStat = list.get(j);
if(nodeNames[i].equals(nodeStat.getNode().getName())){
NodeState nodeState = new NodeState();
nodeState.setNodeName(nodeNames[i]);
nodeState.setTimestamp(nodeStat.getTimestamp());
//jvm
nodeState.setHc(nodeStat.getJvm().getMem().getHeapCommitted().getKb());//分配的堆内存
nodeState.setHu(nodeStat.getJvm().getMem().getHeapUsed().getKb());//使用的堆内存
nodeState.setNhc(nodeStat.getJvm().getMem().getNonHeapCommitted().getKb());//分配的非堆内存
nodeState.setNhu(nodeStat.getJvm().getMem().getNonHeapUsed().getKb());//使用的非堆内存
//nodeStat.getJvm().getMem().getHeapMax().getKb();//
nodeState.setTc(nodeStat.getJvm().getThreads().getCount());//线程数
nodeState.setTpc(nodeStat.getJvm().getThreads().getPeakCount());//线程峰值
nodeStat.getJvm().getGc().collectors();
//cpu
nodeStat.getOs().getCpu().getUser();
nodeStat.getOs().getCpu().getSys();
nodeStat.getOs().getMem().getFree();
nodeStat.getOs().getMem().getUsed();
nodeStat.getOs().getSwap().getFree();
nodeStat.getOs().getSwap().getUsed();
list.remove(j);
nodeList.add(nodeState);
break;
}
}
}
4.查询 api
日期范围查询 需要加上时区
SearchResponse searchResponse = client.prepareSearch(index).setTypes(type)
.setQuery(QueryBuilders.rangeQuery("daytime").from("2015-01-11T00:00:00.000+08:00").to("2015-01-1123:59:59.999+08:00"))
.addSort("daytime",SortOrder.ASC).setSize(Integer.MAX_VALUE)
.execute().actionGet();
//返回结果
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHists = hits.getHits();
if(searchHists.length>0){
for(SearchHit hit:searchHists){
Integer count = (Integer)hit.getSource().get("count");
String ztm = (String) hit.getSource().get("ztm");
String kzh = (String) hit.getSource().get("kzh");
}
}
分组查询排序(但有的聚合查询不知道为什么不能查出所有文档?)
//先根据name字段分组,再根据number字段求和,最后根据sum排序
TermsBuilder termBuilder = AggregationBuilders.terms("c").field("name")
.order(Terms.Order.aggregation("sum", false))
.subAggregation(
AggregationBuilders.sum("sum").field("number")
).size(size);
根据三级子聚合排序
//根据bj字段分组,找到所关联的子type person,再根据子type中的count字段求和,根据第三几子聚合排序
TermsBuilder termBuilder = AggregationBuilders.terms("a").field("bj")
.order(Terms.Order.aggregation("b>c", false))
.subAggregation(
AggregationBuilders.children("b").childType("person")
.subAggregation(AggregationBuilders.sum("c").field("count"))
).size(10);<pre class="java" name="code"><pre class="java" name="code">//上面聚合是子查询,那么根据子集的数据条件查询需要用到hasChildQuery
SearchResponse searchResponse = esHandler.getClient().prepareSearch(index) .setTypes(tyep).addAggregation(termBuilder) .setQuery(QueryBuilders.hasChildQuery("person", QueryBuilders.matchQuery("year", year))).execute().actionGet();
Terms bTerm = searchResponse.getAggregations().get("a");
// For each entry
int i=0;
for (Terms.Bucket entry : bTerm.getBuckets()) {
String key = entry.getKey(); // bucket key
// long docCount = entry.getDocCount(); // Doc count
legendList.add(key);
// We ask for top_hits for each bucket
Children children = entry.getAggregations().get("b");
Sum sum = children.getAggregations().get("c");
int value = (int)sum.getValue();
numberList.add(value+"");
if(i==9){
break;
}
i++;
}
多条件查询
setQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("year", year))
.must(QueryBuilders.matchQuery("user", user))
)
另外关联查询中既显示父级有显示子级
<pre class="java" name="code">//子级是comment ,没有找到直接用api查询的语句
{ "query": { "has_child": { "type": "comment", "query": { "match_all": {} }, "inner_hits": {} } }, "aggs": { "a": { "terms": { "field": "uname" }, "aggs": { "b": { "count": { "field": "uname" } } } } }}
setQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("year", year))
.must(QueryBuilders.matchQuery("dzlb", dzlb))
)