Elasticsearch Java API 之Query、Filter、count、Aggregations
1、Query查询器
查询器(query)倾向于更准确的查找,根据elasticsearch内部分析相关度得到与搜索内容匹配度更高的内容,因此速度较慢。
elasticsearch有着默认分词器。term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇。使用term要确定的是这个字段是否“被分析”(analyzed),默认的字符串是被分析的。
例如存入“日志”,分词器默认把中文分割存储,存为“日”“志”,当查询“日志”时发现查不到;或者存入"error log",因其中有空格,所以其实存入es的数据为"error""log",当查询"error log"时会发现查不到。这是因为默认"index":"analyzed",即默认对该字段进行分析,可设置"index":"not_analyzed"即不对该字段进行分词。
match是查询的字符串也是要被分析的,如果存入字符串是被分析的,如果想被查到,就必须要用matchquery。
构造Query查询器实例:
- QueryBuilder qb = termQuery("_type", "log");
- SearchResponse response = transportClient.prepareSearch("test_tx")
- .setQuery(qb)
- .setFrom(0).setSize(60).setExplain(true)
- .execute()
- .actionGet();
prepareSearch(String str),str为index即索引名,如若prepareSearch()即为查询整个集群。
多条件查询Query查询:
- QueryBuilder qb = boolQuery()
- .must(termQuery("type", "typeValue"))
- .mustNot(termsQuery("logrank",logrank)).
- .should(termsQuery("logsource",logsource));
must、mustNot、should分别代表and、not、or逻辑。
构造好Query传到elasticsearch里进行查询:
- SearchResponse response = client.prepareSearch()
- .setQuery(query)
- .setFrom(0).setSize(60).setExplain(true)
- .execute()
- .actionGet();
2、Filter过滤器
过滤器(filter)通常用于过滤文档的范围,比如某个字段是否属于某个类型,或者是属于哪个时间区间。filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。
- FilterBuilders.andFilter(
- FilterBuilders.rangeFilter("age").from(1).to(100),
- FilterBuilders.prefixFilter("name", "Jack")
- );
同样,多条件查询也可以用boolFilter():
- FilterBuilders.boolFilter()
- .must(FilterBuilders.termFilter("name", "Jack"))
- .mustNot(FilterBuilders.rangeFilter("age").from(10).to(30))
- .should(FilterBuilders.termFilter("home", "hometown"));
- }
构造好Filter 传到elasticsearch里进行过滤:
- SearchResponse response = client.prepareSearch()
- .setFilter(filterBuilder)
- .execute().actionGet();
3、Count
count API允许轻松地执行一个查询,获得匹配的数量,可以跨越一个或多个index ,一个或多个type。
- QueryBuilder qb = boolQuery()
- .must(termQuery("logRank", logRank));
- CountResponse response = client.prepareCount("test_tx") // 索引
- .setQuery(qb) //类型
- .execute().actionGet();
4、Aggregations聚合
4.1 DateHistogram日期聚合
date histogram为Bucket(桶)聚合中的常用聚合。
其中,interval字段支持多种关键字:`year`, `quarter`, `month`, `week`, `day`, `hour`, `minute`, `second`,
返回的结果可以通过设置format进行格式化。
- DateHistogramBuilder dateAgg = AggregationBuilders.dateHistogram("dateAgg");//取名字
- dateAgg.field("time"); //设置聚合字段
- dateAgg.interval(DateHistogram.Interval.YEAR);
- //dateAgg.interval(DateHistogram.Interval.QUARTER);
- //dateAgg.interval(DateHistogram.Interval.MONTH);
- //dateAgg.interval(DateHistogram.Interval.weeks(2));
- //dateAgg.interval(DateHistogram.Interval.days(1));
- //dateAgg.interval(DateHistogram.Interval.hours(2));
- //dateAgg.interval(DateHistogram.Interval.minutes(5));
- //dateAgg.interval(DateHistogram.Interval.seconds(10));
- dateAgg .format("yyyy-MM-dd") //设置聚合日期格式
- .minDocCount(0) //设置聚合后最小值,防止聚合数为0时得到的结果没有该项
- .extendedBounds(beginDate, endDate); //强制设置时间范围
然后在elasticsearch中开始聚合:
- SearchResponse response = client.prepareSearch()
- .addAggregation("dateAgg")
- .execute().actionGet();
- Map<String, Long> logNumByDay = new HashMap<String, Long>();
- DateHistogram aggByDay = response.getAggregations().get("dateAgg"); //得到聚合后的桶
- for(DateHistogram.Bucket logByDay : aggByDay.getBuckets()) //遍历桶
- {
- logNumByDay.put(logByDay.getKey(),logByDay.getDocCount()); //对每个桶取信息构造键值对
- }
4.2 terms聚合
- public Map<String, Long> getTypesAggNum(String type, List<String> logRank, Date beginDate, Date endDate) {
- TermsBuilder typeAgg = AggregationBuilders
- .terms("typeAgg") //取名字
- .field(type); //聚合属性
- SearchResponse response = client.prepareSearch("testindex")
- .setQuery(boolQuery()
- .must(termsQuery("logRank", logRank))
- .must(rangeQuery("time").from(beginDate).to(endDate))
- )
- .addAggregation(typeAgg)
- .execute().actionGet();
- Map<String, Long> logNumByAgg = new LinkedHashMap<>();
- Terms aggByType = response.getAggregations().get("typeAgg"); //取结果
- for(Bucket logByType : aggByType.getBuckets())
- {
- logNumByAgg.put(logByType.getKey(),logByType.getDocCount());
- }
- return logNumByAgg;
- }
上述代码为以“logRank”属性取值为logRank链表内元素并且时间范围在beginDate与endDate之间条件进行查询后,根据type进行聚合,聚合后的结果为terms类型,terms聚合为根据属性所有取值进行聚合。
一些官方(官方才是最好用的):Java API、es权威指南、真正官方
Elasticsearch Java API 之Query、Filter、count、Aggregations相关推荐
- Elasticsearch Java API 分组、聚合、嵌套相关查询
Elasticsearch Java API 分组.聚合.嵌套相关查询 翼支付监控系统正使用es做后端存储,这边我们是将日志计算处理过后的数据通过kafka储存到es.选择用es作为数据储存端是考虑到 ...
- Elasticsearch8.0版本中Elasticsearch Java API Client客户端的基本使用方法
关于Elasticsearch Java API Client客户端如何连接以及如何对索引和文档进行基本的增删改查操作请查看我的上一篇博文:Elasticsearch RestHighLevelCli ...
- Elasticsearch Java API四种实现方式
0.题记 之前Elasticsearch的应用比较多,但大多集中在关系型.非关系型数据库与Elasticsearch之间的同步.以上内容完成了Elasticsearch所需要的基础数据量的供给.但想要 ...
- Elasticsearch Java API 很全的整理以及架构剖析
Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种.相比来说transportClient API效率更高, ...
- ElasticSearch Java Api(四) -删除索引
删除可以是删除整个索引库,也可以根据文档id删除索引库下的文档,还可以通过query查询条件删除所有符合条件的数据. 一.删除整个索引库 下面的例子会删除indexName索引: DeleteInde ...
- Elasticsearch RestHighLevelClient 已标记为被弃用 它的替代方案 Elasticsearch Java API Client 的基础教程及迁移方案
在Elasticsearch7.15版本之后,Elasticsearch官方将它的高级客户端RestHighLevelClient标记为弃用状态.同时推出了全新的Java API客户端Elastics ...
- Elasticsearch Java API 6.2(java client)
前言 本节描述了Elasticsearch提供的Java API,所有的Elasticsearch操作都使用客户端对象执行,所有操作本质上都是完全异步的(要么接收监听器,要么未来返回). 此外,客户端 ...
- ElasticSearch Java Api(一) -创建索引
ElasticSearch Java API官网文档:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/jav ...
- SpringBoot整合最新Elasticsearch Java API Client 7.16教程
文章目录 前言 一.Elasticsearch和Kibana 7.16版本安装 二.pom.xml文件引入依赖 三.代码实例 总结 前言 最新在学习SpringBoot整合es的一些知识,浏览了网上的 ...
最新文章
- Android stadio bug
- SpringMVC一个Controller处理所有用户请求的并发问题
- 考研结束后去政审时穿的鞋子
- Oracle存储过程中如何根据指定的参数判断该参数的值否存在数据表中:
- 漫话:如何给女朋友解释什么是删库跑路?
- Golang sync.Once 简介与用法
- mysql delete 数据之后 .MYD文件大小没有发生变化
- SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 4)
- Atitit 信息检索 v3 t55.docx Atitit 现代信息检索 目录 1.1. 信息检索(索引 索引 结构化文本	1 1.2. Atitit 重要章节	1 1.3. 息检索建模	1 1.
- 〔转〕Word域的应用和详解2_等式和公式域
- fingerprint模块管理指纹识别
- Python学习笔记7——数据类型(中)
- 由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断
- 1800 Flying to the Mars 大数 最多不上升序列 简化题意
- 阿里在线免费图标库的使用
- 第7章第24节:双图排版:两张图片的一大一小对比排版 [PowerPoint精美幻灯片实战教程]
- 任意多边形的面积(C语言)
- 起枪还是ECO ? CSGO什么时候起长枪 CSGO超实用教学
- 一种基于傅里叶变换的相位配准算法phase correlation approach,利用互功率谱得到时空的平移。
- 电动汽车如何为电网供电