文档章节

ElasticSearch2.3.4之Java Api调用例子

九劫散仙
 九劫散仙
发布于 2016/08/11 19:22
字数 1522
阅读 617
收藏 6
点赞 0
评论 3

ElasticSearch2.3.4

序号覆盖功能例子
1客户端链接初始化
2filte无评分查询用法
3query有评分查询用法
4单字段分组用法
5多字段分组用法
6读取有索引无存储数据的用法
7设置指定字段返回

代码如下:

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

	}


	/***
	 * 每一天的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);
		}
	}


	/***
	 *  获取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);
	}

	/***
	 * 最新版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),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。 image

ElasticSearch2.x API变化官网链接

https://www.elastic.co/guide/en/elasticsearch/reference/2.3/breaking-changes-2.0.html

© 著作权归作者所有

共有 人打赏支持
九劫散仙
粉丝 261
博文 174
码字总数 189625
作品 0
海淀
加载中

评论(3)

码上中国博客
码上中国博客
我自己翻译了elasticsearch的官方文档,欢迎大家查阅:
https://www.blog-china.cn/template/documentHtml/1484101683485.html
九劫散仙
九劫散仙

引用来自“苏城”的评论

这个东东是干哈的?
全文检索框架
苏城
这个东东是干哈的?
Java 5 、6、 7中新特性

JDK5新特性(与1.4相比)【转】 1 循环 for (type variable : array){ body} for (type variable : arrayList){body} 而1.4必须是: for (int i = 0; i < array.length; i++){ type variabl......

thinkyoung ⋅ 2014/10/14 ⋅ 0

12、Java并发性和多线程-Java同步块

以下内容转自http://ifeve.com/synchronized-blocks/: Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容: Java同步关键字(s...

easonjim ⋅ 2017/06/15 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

编写你的第一个HelloWorld

写在前面的话 因为Java基础是以后学习框架的基石,因此开个文集首先写写Java基础,本来想直奔基础知识的介绍,但是为了保证知识的完整性,因此从Java安装和运行“hello world”开始(虽然百度...

nanaFighting ⋅ 06/15 ⋅ 0

你不知道 Java 10 的 5 件事

局部变量类型推断是有争议的热点,但Java 10在JVM中的垃圾收集和容器识别上带来了可喜的变化。 关于本系列 所以你认为你了解Java编程? 事实是,大多数开发人员只是浮于Java平台的表面上,仅...

ismdeep ⋅ 04/24 ⋅ 0

Java基础之反射(非常重要)

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道...

Java-老刘 ⋅ 05/15 ⋅ 0

10 个精妙的 Java 编码最佳实践

(点击上方公众号,可快速关注) 来源:ImportNew - liken 这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表。和Josh Bloch的列表容易学习并且关注日常情况相比,这...

ImportNew ⋅ 04/15 ⋅ 0

通过 HttpAuthenticationMechanism 执行 Web 身份验证

通过 Java EE 8 中新的注解驱动的 HTTP 身份验证机制执行经典和自定义的 Servlet 身份验证 系列内容: 此内容是该系列 4 部分中的第 # 部分: Java EE 8 Security API 入门,第 2 部分 http...

Alex Theedom ⋅ 04/02 ⋅ 0

深入理解Java虚拟机的体系结构

JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果...

java进阶 ⋅ 06/22 ⋅ 0

Java多线程学习(四)等待/通知(wait/notify)机制

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀 ⋅ 04/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 43分钟前 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部