关于elasticsearch 的一些查询

本文介绍了如何使用Java API连接Elasticsearch服务器、监测集群及节点状态,并提供了多种查询方法,包括日期范围查询、分组查询排序、多条件查询等。

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


 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值