`
qindongliang1922
  • 浏览: 2172502 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117131
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125456
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59564
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71043
社区版块
存档分类
最新评论

ElasticSearch2.3.4之Java Api调用例子

    博客分类:
  • ELK
阅读更多


package com.curd.es;

import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
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.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramBuilder;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
import org.joda.time.DateTime;

import java.net.InetSocketAddress;
import java.util.List;
import java.util.Map;

public class ElasticSearchToolsTest {


	//elasticsearch2.3的客户端实例
	static Client client=null;
	static {
		//设置集群名字
		Settings settings = Settings.settingsBuilder()
		        .put("cluster.name", "search")
		        .put("client.transport.sniff", true)
		       . build();
		try {
			//初始化连接客户端
			client = new TransportClient.Builder().settings(settings).build()
					.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("192.168.201.5",9300)))
					.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("192.168.201.6",9300)))
					.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("192.168.201.7",9300)));
		}catch (Exception e){
			e.printStackTrace();
		}

	}


	/****
	 * 测试读取仅仅索引没有存储的字段,从倒排里面加载数据
	 * 过滤数据
	 */
	public static void filterQueryString(){
		//构建查询请求
		SearchRequestBuilder search=client.prepareSearch("monitor").setTypes("monitor");
		BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
				.must(QueryBuilders.queryStringQuery("*:*"))
				.filter(QueryBuilders.queryStringQuery("+mtitle:北京奇虎科技     +dtime:[1443196800000 TO 1451059200000] ").defaultOperator(Operator.AND));
				search.setQuery(boolQuery);
		search.addFieldDataField("t1");//索引,没有存储的域,从field data里面加载数据
		search.addFieldDataField("t2");//索引,没有存储的域,从field data里面加载数据
		search.addFieldDataField("t3");//索引,没有存储的域,从field data里面加载数据
		search.addFieldDataField("dtime");//索引,没有存储的域,从field data里面加载数据
		SearchResponse r = search.get();
		for(SearchHit hit:r.getHits()){
			String id=hit.getId();
			String index=hit.getIndex();
			String type=hit.getType();
			String t1=hit.getFields().get("t1").getValue();
			String t2=hit.getFields().get("t2").getValue();
			String t3=hit.getFields().get("t3").getValue();
			Long time=hit.getFields().get("dtime").getValue();
			Float score=hit.getScore();
			System.out.println(id+"\t"+t1+"\t"+t2+"\t"+t3+"\t"+time+"\t"+score);
		}
		System.out.println("总数量:"+r.getHits().getTotalHits());
		System.out.println("耗时:"+r.getTookInMillis());
	}


	public static void main(String[] args) throws Exception {

		//单个聚合字段,支持.写法
		String aggField="data.subjectId";
//		testOneAggString(aggField);
		testFilter();
		client.close();

	}

	/***
	 *  获取search请求的结果,并输出打印结果信息
	 * @param search
	 * @throws Exception
     */
	public  static void showResult(SearchRequestBuilder search) throws Exception{
		SearchResponse r = search.get();//得到查询结果
		for(SearchHit hits:r.getHits()){
			//只能获取addFields里面添加的字段
//			System.out.println(hits.getFields().get("userId").getValue());
			//默认可会source里面获取所需字段
			System.out.println(hits.getSource().get("actId"));
			//注意不支持data.subjectName这样的访问方式
			//System.out.println(hits.getId()+"  "+hits.score()+"  "+data.get("subjectName"));
			//如果是个嵌套json,需要转成map后,访问其属性
//			Map data=(Map) hits.getSource().get("data");
//			System.out.println(hits.getId()+"  "+hits.score()+"  "+data.get("subjectName"));


		}
		long hits=r.getHits().getTotalHits();//读取命中数量
		System.out.println(hits);
	}


	/***
	 * 每一天的select count(distinct(actid)) from talbe group by date
     */
	public static void countDistinctByField(){


		//构造search请求
		SearchRequestBuilder search=client.prepareSearch("userlog*").setTypes("logs");
		search.setQuery(QueryBuilders.queryStringQuery("@timestamp:[ "+new DateTime(2016, 8, 8, 0, 0, 0).getMillis()
				+" TO "+new DateTime(2016, 8, 15, 0, 0, 0).getMillis()+"}"
		));
		search.setSize(0);
		//一级分组字段
		DateHistogramBuilder dateagg = AggregationBuilders.dateHistogram("dateagg");
		dateagg.field("@timestamp");//聚合时间字段
//		dateagg.interval(DateHistogramInterval.HOUR);//按小时聚合
		dateagg.interval(DateHistogramInterval.DAY);//按天聚合
//		dateagg.format("yyyy-MM-dd HH"); //格式化时间
		dateagg.format("yyyy-MM-dd"); //格式化时间
		dateagg.timeZone("Asia/Shanghai");//设置时区,注意如果程序部署在其他国家使用时,使用Joda-Time来动态获取时区 new DateTime().getZone()

		//二级分组字段
//		TermsBuilder twoAgg = AggregationBuilders.terms("stragg").field("actId");
		MetricsAggregationBuilder twoAgg = AggregationBuilders.cardinality("stragg").field("actId");

		//组装聚合字段
		dateagg.subAggregation(twoAgg);
		//向search请求添加
		search.addAggregation(dateagg);
		//获取结果
		SearchResponse r = search.get();
		Histogram h = r.getAggregations().get("dateagg");
		//得到一级聚合结果里面的分桶集合
		List<Histogram.Bucket> buckets = (List<Histogram.Bucket>) h.getBuckets();
		//遍历分桶集
		for(Histogram.Bucket b:buckets){
			//读取二级聚合数据集引用
			Aggregations sub = b.getAggregations();
			//获取二级聚合集合
			Cardinality agg = sub.get("stragg");
			//获取去重后的值
			long value = agg.getValue();
			//如果设置日期的format的时候,需要使用keyAsString取出,否则获取的是UTC的标准时间
			System.out.println(b.getKeyAsString() +"  " +b.getDocCount()+" "+value);
		}
	}





	/***
	 * 最新版elasticsearch2.3的query测试,结果会评分
	 * @throws Exception
     */
	public static void testQuery() throws Exception{
		SearchRequestBuilder search=client.prepareSearch("userlog*").setTypes("logs");
		String subjectName="语文";
		//注意查询的时候,支持嵌套的json查询,通过点符号访问下层字段,读取结果时不支持这种方式
 		search.setQuery(QueryBuilders.queryStringQuery("+data.subjectName:* -data.subjectName:"+subjectName+"  "));
		showResult(search);
	}

	/***
	 * 最新版的elasticsearch2.3的filterquery测试,结果不会评分
	 * @throws Exception
     */
	public static void testFilter() throws Exception{
		SearchRequestBuilder search=client.prepareSearch("userlog*").setTypes("logs");
		//第一个参数包含的字段数组,第二个字段排除的字段数组
//		search.setFetchSource(new String[]{"userId","actId"},null);
//		search.addFields("actId","userId"); //另一种写法
		String schoolName="沙河市第三小学";
		BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
				.must(QueryBuilders.queryStringQuery("*:*"))
				.filter(QueryBuilders.queryStringQuery("+data.subjectName:* +schoolName:"+schoolName).defaultOperator(Operator.AND));
		//设置query
		search.setQuery(boolQuery);
		//打印结果数据
		showResult(search);
	}

	/***
	 *  两个字段分组测试,在时间的维度上加上任意其他的字段聚合,类似group by field1,field2
	 * @throws Exception
     */
	public static void testTwoAggString() throws Exception{
		//构造search请求
		SearchRequestBuilder search=client.prepareSearch("userlog*").setTypes("logs");
		search.setQuery(QueryBuilders.queryStringQuery("@timestamp:[ "+new DateTime(2016, 8, 10, 0, 0, 0).getMillis()
		+" TO "+new DateTime(2016, 8, 11, 0, 0, 0).getMillis()+"}"
		));
		//一级分组字段
		DateHistogramBuilder dateagg = AggregationBuilders.dateHistogram("dateagg");
		dateagg.field("@timestamp");//聚合时间字段
		dateagg.interval(DateHistogramInterval.HOUR);//按小时聚合
		dateagg.format("yyyy-MM-dd HH"); //格式化时间
		dateagg.timeZone("Asia/Shanghai");//设置时区,注意如果程序部署在其他国家使用时,使用Joda-Time来动态获取时区 new DateTime().getZone()

		//二级分组字段
		TermsBuilder twoAgg = AggregationBuilders.terms("stragg").field("module");
		//组装聚合字段
		dateagg.subAggregation(twoAgg);
		//向search请求添加
		search.addAggregation(dateagg);
		//获取结果
		SearchResponse r = search.get();
		Histogram h = r.getAggregations().get("dateagg");
		//得到一级聚合结果里面的分桶集合
		List<Histogram.Bucket> buckets = (List<Histogram.Bucket>) h.getBuckets();
		//遍历分桶集
		for(Histogram.Bucket b:buckets){
			//读取二级聚合数据集引用
			Aggregations sub = b.getAggregations();
			//获取二级聚合集合
			StringTerms count = sub.get("stragg");
			//如果设置日期的format的时候,需要使用keyAsString取出,否则获取的是UTC的标准时间
			System.out.println(b.getKeyAsString() +"  " +b.getDocCount());
			System.out.println("=============================================");
			for(Terms.Bucket bket:(List<Terms.Bucket>)count.getBuckets()){

				System.out.println(bket.getKeyAsString() +"  "+bket.getDocCount());
			}
			System.out.println("************************************************");

		}

	}


	/***
	 *  一个字段聚合,类似数据库的group by field1
	 * @param field 测试聚合的字段
	 * @throws Exception
     */
	public static  void testOneAggString(String field)throws Exception{
		//构造search请求
		SearchRequestBuilder search=client.prepareSearch("userlog*").setTypes("logs");
		//查询昨天的数据
		search.setQuery(QueryBuilders.queryStringQuery("@timestamp:[ "+new DateTime(2016, 8, 10, 0, 0, 0).getMillis()
				+" TO "+new DateTime(2016, 8, 11, 0, 0, 0).getMillis()+"}"
		));
		//聚合构造
		TermsBuilder termsBuilder = AggregationBuilders.terms("agg").field(field);
		//添加到search请求
		search.addAggregation(termsBuilder);
		//获取结果
		SearchResponse searchResponse = search.get();
		//获取agg标识下面的结果
		Terms agg1 = searchResponse.getAggregations().get("agg");
		//获取bucket
		List<Terms.Bucket> buckets = (List<Terms.Bucket>) agg1.getBuckets();
		long sum=0;
		for(Terms.Bucket b:buckets){
			Aggregations sub = b.getAggregations();
			System.out.println(b.getKeyAsString()+"  "+b.getDocCount());
			sum+=b.getDocCount();
		}
		System.out.println("总数:"+sum);
	}

}



有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。

  • 大小: 144.7 KB
  • 大小: 19.9 KB
0
2
分享到:
评论

相关推荐

    ElasticSearch Java API 中文文档

    标签《ES Java API 中文文档》强调了文档的内容属性,它属于ElasticSearch的一个重要组成部分,即用Java语言进行数据交互和操作的应用程序接口部分。 从部分内容中可以提取出以下知识点: 1. **Transport Client**...

    elasticsearch-2.3.4_IK_HEAD

    **Elasticsearch 2.3.4 和 IK Head 插件详解** Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,它能够处理大量的数据并提供快速的搜索、分析和实时的数据存储功能。在版本 2.3.4 中,Elastic...

    基于Elasticsearch2.1.1的JavaAPI基本操作代码示例

    在这个基于Elasticsearch 2.1.1的Java API基本操作代码示例中,我们将探讨如何利用Java API进行常见的数据操作,如索引创建、文档插入、查询以及更新。 首先,为了使用Elasticsearch的Java API,我们需要在项目中...

    elasticsearch java api

    **Elasticsearch Java API**是Elasticsearch官方提供的用于与Elasticsearch服务器进行交互的Java客户端库。在Java应用程序中,我们通常会使用这个API来创建、查询、更新和删除索引中的数据。Elasticsearch 2.3版本的...

    ES(elasticSearch6.4.0)之java API源码demo-完整注释版

    ES(elasticSearch6.4.0)之java API源码demo-完整注释版,本版本为上一demo版本升级版,封装了ES的javaAPI,支持了模糊查询,排序查询,解析,分页查询等功能,如果有问题请留言。我会及时回复。

    ES(elasticSearch6.4.0)之java API源码demo

    ElasticSearch是个开源的分布式的搜索引擎,它可以近乎实时的存储、检索数据;... ElasticSearch提供javaAPI,使用者可以通过javaAPI调用,但是7.0以后不会提供普通javaAPI,需要使用高级APIrest-high-level调用。

    ElasticSearch java API

    ElasticSearch 官方 java API

    使用Java调用ElasticSearch提供的相关API进行数据搜索完整实例演示

    在本文中,我们将深入探讨如何使用Java调用Elasticsearch(ES)提供的API进行数据搜索。Elasticsearch是一个流行的开源全文搜索引擎,具有分布式、实时、可扩展性等特性,广泛应用于大数据分析和日志检索等领域。...

    基于Elasticsearch Java API的参考手册

    **Elasticsearch Java API详解** Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,广泛应用于大数据领域的实时分析和信息检索。Java API是Elasticsearch官方提供的与Elasticsearch服务器进行交互的...

    elasticsearch离线JAVA API文档下载

    **Elasticsearch离线Java API文档详解** Elasticsearch(简称ES)是一款强大的开源搜索引擎,广泛应用于数据分析、日志分析和全文检索等场景。它的Java API是开发人员与Elasticsearch进行交互的主要工具,提供了...

    elasticsearch java api 离线文档

    **Elasticsearch Java API 离线文档** Elasticsearch 是一个开源的全文搜索引擎,它提供了高度可扩展的、实时的搜索与分析引擎服务。Java API 是 Elasticsearch 提供的用于与集群交互的主要接口,允许开发者在 Java...

    elasticsearch5.6以上version通用java API

    在"elasticsearch5.6以上version通用java API"中,我们将会探讨如何利用Java编写工具类,以覆盖更全面的操作,如映射创建、批量插入、聚合查询以及模糊和精确查询。 1. **映射创建**:Elasticsearch的映射(Mapping...

    ElasticSearch Java API

    **Elasticsearch Java API**是Elasticsearch与Java应用程序交互的主要工具,它允许开发者在Java环境中无缝地创建、管理和查询Elasticsearch索引。Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,用于...

    elasticsearch-6.3.0-API文档-中文版.zip

    标签:elasticsearch、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    elasticsearch-2.3.4

    elasticsearch-2.3.4 。ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是...

    Elasticsearch5.x Java API手册

    Elasticsearch 5.x 版本的 Java API 手册是开发者进行 Elasticsearch 相关开发的重要参考资料。Elasticsearch 是一个流行的开源全文搜索引擎,广泛应用于数据检索、分析和实时数据存储。Java API 提供了与 Elastic...

    elasticsearch2.3.4.rar

    Elasticsearch 2.3.4 引入了 Reindex API,允许用户在不中断服务的情况下,重新索引数据到新的索引或不同的集群,方便进行数据迁移或更新索引设置。 10. **文档版本控制** Elasticsearch 实现了文档版本控制,...

    JAVA实现ElasticSearch的简单实例

    2. **Java API**:Elasticsearch提供了Java REST客户端,使得开发者可以直接通过Java代码与ES集群进行交互。这个API简化了与ES通信的复杂性,并且性能高效。 3. **Elasticsearch安装与配置**:在开始编写Java程序...

    elasticsearch-6.2.3-API文档-中文版.zip

    标签:elasticsearch、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    elasticsearch-2.3.4.rpm

    elasticsearch-2.3.4.rpm elasticsearch-2.3.4.rpm elasticsearch-2.3.4.rpm elasticsearch-2.3.4.rpm

Global site tag (gtag.js) - Google Analytics