Elasticsearch 2.2.0 JAVA开发篇:搜索操作

普通查询

Elasticsearch java API同时提供了强大的搜索功能,不过这也是很正常的因为所有的http接口到后面都要转换成java代码才可以执行。索引名和type名称都可以是多个,用逗号分开。

SearchRequestBuilder  sbuilder = client.prepareSearch("secilog") //index name

.setTypes( "type") //type name

.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

.setQuery(QueryBuilders.termQuery("message", "insert")) // Query

.setPostFilter(QueryBuilders.rangeQuery("eventCount").from(1).to(18))// Filter

.setFrom(0).setSize(60).setExplain(true);

System.out.println(sbuilder.toString());

SearchResponse response = sbuilder.execute().actionGet();

System.out.println(response.toString());

SearchRequestBuilder就是请求的json字符串的解析后的对象,如果想看json数据非常简单,主要把这个对象打印出来就可以,例如上面例子中的System.out.println(sbuilder.toString());

比如我这里打印出的结果见下面,是不是很强大:

{

"from" : 0,

"size" : 60,

"query" : {

"term" : {

"message" : "insert"

}

},

"post_filter" : {

"range" : {

"eventCount" : {

"from" : 1,

"to" : 18,

"include_lower" : true,

"include_upper" : true

}

}

},

"explain" : true

}

SearchResponse是搜索出来的结果,同样可以把这个对象打印出来看一下搜索的结果。下面是我搜索的部分内容:

{

"took" : 1,

"timed_out" : false,

"_shards" : {

"total" : 1,

"successful" : 1,

"failed" : 0

},

"hits" : {

"total" : 1,

"max_score" : 0.15342641,

"hits" : [ {

"_shard" : 0,

"_node" : "jevOQqVQT_a_pAGqKA0p7w",

"_index" : "secilog",

"_type" : "log",

"_id" : "1",

"_score" : 0.15342641,

"_source" : {

"type" : "syslog",

"eventCount" : 1,

"eventDate" : "2016-02-18T06:13:10.818Z",

"message" : "secilog insert doc test"

},

"_explanation" : {

.......

}

} ]

}

}

需要注意的是,上面例子中的参数都可以忽略,例如可以查询全部:

SearchResponse response = client.prepareSearch().execute().actionGet();

查询总数

查询总数和普通查询语法一样,唯一的就是把size设置为0。

SearchRequestBuilder  sbuilder = client.prepareSearch("secilog") //index name

.setTypes( "type") //type name

.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

.setQuery(QueryBuilders.termQuery("message", "insert"))        // Query

.setPostFilter(QueryBuilders.rangeQuery("eventCount").from(1).to(18)) // Filter

.setFrom(0).setSize(0).setExplain(true);

System.out.println(sbuilder.toString());

SearchResponse response = sbuilder.execute().actionGet();

System.out.println(response.toString());

System.out.println(response.getHits().getTotalHits());

返回的内容:

{

"took" : 1,

"timed_out" : false,

"_shards" : {

"total" : 1,

"successful" : 1,

"failed" : 0

},

"hits" : {

"total" : 2,

"max_score" : 0.0,

"hits" : [ ]

}

}

滚动查询scroll

具体说明详见文章Elasticsearch 2.20 滚动查询请求,通过java也是比较方便的得到此信息。

QueryBuilder qb = QueryBuilders.termQuery("message", "insert");

SearchRequestBuilder  sbuilder = client.prepareSearch(indexName)

.setSearchType(SearchType.SCAN)

.setScroll(new TimeValue(60000))

.setQuery(qb)

.setSize(100);

System.out.println(sbuilder);

//100 hits per shard will be returned for each scroll

SearchResponse scrollResp = sbuilder.execute().actionGet();

while (true) {

for (SearchHit hit : scrollResp.getHits().getHits()) {

System.out.println(hit.getSource());

}

scrollResp = client.prepareSearchScroll(scrollResp.getScrollId())

.setScroll(new TimeValue(60000)).execute().actionGet();

System.out.println(scrollResp);

//Break condition: No hits are returned

if (scrollResp.getHits().getHits().length == 0) {

break;

}

}

我们同样可以打印一下请求的记录和返回的内容。

{

"size" : 100,

"query" : {

"term" : {

"message" : "insert"

}

}

}

{

"_scroll_id" : "c2NhbjswOzE7dG90YWxfaGl0czoyOw==",

"took" : 3,

"timed_out" : false,

"_shards" : {

"total" : 1,

"successful" : 1,

"failed" : 0

},

"hits" : {

"total" : 2,

"max_score" : 0.0,

"hits" : [ {

"_index" : "secilog",

"_type" : "log",

"_id" : "1",

"_score" : 0.0,

"_source" : {

"type" : "file",

"eventCount" : 1,

"eventDate" : "2016-02-18T06:13:10.818Z",

"message" : "secilog insert doc test"

}

}, {

"_index" : "secilog",

"_type" : "log",

"_id" : "3",

"_score" : 0.0,

"_source" : {

"type" : "syslog",

"eventCount" : 2,

"eventDate" : "2016-02-18T06:19:59.015Z",

"message" : "secilog insert doc test"

}

} ]

}

}

本文由赛克 蓝德(secisland)原创,转载请标明作者和出处。

简单的汇聚查询

SearchRequestBuilder  sbuilder = client

.prepareSearch(indexName)

.setQuery(QueryBuilders.matchAllQuery())

.addAggregation(AggregationBuilders.terms("type").field("type"))

.addAggregation(

AggregationBuilders.dateHistogram("eventDate").field("eventDate")

.interval(DateHistogramInterval.YEAR));

System.out.println(sbuilder);

SearchResponse sr = sbuilder.execute().actionGet();

System.out.println(sr);

// Get your facet results

StringTerms agg1 = sr.getAggregations().get("type");

System.out.println(agg1.getBuckets().get(0).getKeyAsString()+":"

+agg1.getBuckets().get(0).getDocCount());

InternalHistogram<?> agg2 = sr.getAggregations().get("eventDate");

List<? extends Histogram.Bucket> bucketList = ((Histogram) agg2).getBuckets();

System.out.println(bucketList.get(0).getKeyAsString()+":"

+bucketList.get(0).getDocCount());

然后我们看一下请求的参数:

{

"query" : {

"match_all" : { }

},

"aggregations" : {

"type" : {

"terms" : {

"field" : "type"

}

},

"eventDate" : {

"date_histogram" : {

"field" : "eventDate",

"interval" : "1y"

}

}

}

}

返回的结果:

{

"took" : 16,

"timed_out" : false,

"_shards" : {

"total" : 1,

"successful" : 1,

"failed" : 0

},

"hits" : {

"total" : 2,

"max_score" : 1.0,

"hits" : [ {

"_index" : "secilog",

"_type" : "log",

"_id" : "1",

"_score" : 1.0,

"_source" : {

"type" : "file",

"eventCount" : 1,

"eventDate" : "2016-02-18T06:13:10.818Z",

"message" : "secilog insert doc test"

}

}, {

"_index" : "secilog",

"_type" : "log",

"_id" : "3",

"_score" : 1.0,

"_source" : {

"type" : "syslog",

"eventCount" : 2,

"eventDate" : "2016-02-18T06:19:59.015Z",

"message" : "secilog insert doc test"

}

} ]

},

"aggregations" : {

"eventDate" : {

"buckets" : [ {

"key_as_string" : "2016-01-01T00:00:00.000Z",

"key" : 1451606400000,

"doc_count" : 2

} ]

},

"type" : {

"doc_count_error_upper_bound" : 0,

"sum_other_doc_count" : 0,

"buckets" : [ {

"key" : "file",

"doc_count" : 1

}, {

"key" : "syslog",

"doc_count" : 1

} ]

}

}

}

从上面可以看出,java接口的功能是非常强大的。

赛克蓝德(secisland)后续会逐步对Elasticsearch的最新版本的各项功能进行分析,近请期待。也欢迎加入secisland公众号进行关注。

时间: 2024-11-01 13:39:03

Elasticsearch 2.2.0 JAVA开发篇:搜索操作的相关文章

0. Java开发中的23种设计模式详解(转)

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

java开发篇---验证码

验证码的作用:防止恶意破解密码.刷票.论坛灌水.刷页. 有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,实际上使用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能.虽然登录麻烦一点,但是对网友的密码安全来说这个功能还是很有必要,也很重要.但我们还是 提醒大家要保护好自己的密码 ,尽量使用混杂了数字.字母.符号在内的6位以上密码,不要使用诸如1234之类的简单密码或者与用户名相同.类似的密码 ,免得你的账号被

[java开发篇][代码规范]

http://www.hawstein.com/posts/google-java-style.html Google Java编程风格指南 January 20, 2014 作者:Hawstein出处:http://hawstein.com/posts/google-java-style.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. 目录 前言 源文件基础 源文件结构 格式 命

Tomcat 8.0+Java开发WebSokcet

环境: eclipse:   eclipse-jee-luna-SR2-win32 jdk:       jdk-8u25-windows-i586 (jdk 1.8) tomcat:apache-tomcat-8.0.9 使用: 1.eclipse中配置好tomcat 2.导入工程文件 3.打开echo.xhtml运行 网上找了很多资料都是断断续续,源码也是不能正常运行,由于工作忙,现先提供源码朋友们下载运行研究(本人学习习惯,先让源码能正常运行再研究内在关联机制结构达到掌握程度)

Java项目(2)——Java开发环境配置|JDK与JRE

C盘扩容--修复Oracle--修改注册表--Windows无法启动--重做系统--重新配置Java开发环境,外加操作考试系统,这三天过的犹如做梦一般.自己写个Java开发环境配置的小总结,做任何事需要的就是一种思路,要懂得来龙去脉,不然自己会死得很惨. 基本步骤就是一系列安装: Jdk Oracle 服务器客户端 Plsql MyEclipse 配置MyEclipse的jdk和tomcat 设置环境变量(jdk和Oracle) plsql连接到Oracle 在配置过程中发现有的教程涉及Jre的

读阿里巴巴Java开发手册v1.2.0之编程规约有感【架构篇】

 不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么随意写,好没问题,但是等你离开这个公司了或者是去开发别的项目了,再等别人过来接手维护你一手写出来的这段个性十足的代码时,那么你的右眼皮时不时地就会跳,因果我就不说了~~ 所以我建议看到这篇博文的朋友们,或许你稍微改变一下你的编码风格,遵从一套好的编码规约对己对人都是有好处的.可能朋友的公司也有专门的

[Java 05 OO] (基础篇) 《Java开发实战经典》

p5OO 第五章 面向对象 (基础篇) Notes (1), Constructor / this / String   String str1 = "hello"; 解释 : 是把一个在堆内存空间的使用权给了 str1 对象.   String str2 = "hello"; str1 == str2 是 true   String 字符串的内容不可改变 (2), Java 常用的内存区域    1), 栈内存空间    2), 堆内存空间    3), 全局数据

Android NDK开发篇(五):Java与原生代码通信(数据操作)

尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用Java的引用类型则要做对应的处理. 一.对引用数据类型的操作 尽管Java的引用类型的实如今NDK被屏蔽了,JNI还是提供了一组API,通过JNIEnv接口指针提供原生方法改动和使用Java的引用类型. 1.字符串操作 JNI把Java的字符串当作引用来处理,在NDK中使用Java的字符串,须要相

JAVA环境下利用solrj二次开发SOlR搜索的环境部署常见错误

问题一:出现控制台坏的响应错误一Bad request 控制台出现错误如下: Bad Request request: http://hostIP:8983/solr/update?wt=javabin&version=1 解决方法: 出现以上错误的原因是,solr服务器上配置的Field和javabean提交的Field不能对应, 导致solr服务器找不到域,拒绝访问. 打开SOLR_HOME下的conf文件夹找到schema.xml文件,在其中添加对应的域. 例如以下代码添加了:title,