ElasticSearch High Level REST API【2】搜索查询
如下为一段带有分页的简单搜索查询示例
在search搜索中大部分的搜索条件添加都可通过设置SearchSourceBuilder来实现,然后将SearchSourceBuilder
RestHighLevelClient client = ElasticClient.getRestHighLevelClient();
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("user", "kimchy"));
sourceBuilder.from(0);
sourceBuilder.size(5);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); //设置一个可选的超时,控制允许搜索的时间
searchRequest.source(sourceBuilder); try {
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
Long total = search.getHits().getTotalHits(); //获取匹配的总数量
System.out.println("总记录数:" + total);
for (SearchHit hit : search.getHits().getHits()) {
float score = hit.getScore(); //获得分数,即匹配度
String source = hit.getSourceAsString();
System.out.println(source);
} } catch (IOException e) {
e.printStackTrace();
}
search查询的返回值为SearchResponse,调用SearchResponse的getHits()方法会获取SearchHits对象,然后再通过SearchHits的getHits()方法即返回一个SearchHit[]数组。
遍历SearchHit[]数组获取每一个对象,通过hit.getScore()可获取分数,即搜索匹配度。通过hit.getSourceAsString()可得到对象的json字符串。
备注:在上述查询中用到了termQuery查询,ES还提供了matchQuery查询,不同的查询需求中需要选择不同的查询,在此需要了解这两个查询的区别:
- termQuery : term为不使用分词器查找,类似精确查找。
- matchQuery : mactch为使用分词器进行查找,会查询到一些近似匹配的内容。
SearchHit使用汇总
要获取返回的内容,需要获得SearchHit,下面总结下SearchHit的一些使用:
SearchHits hits = searchResponse.getHits();
long totalHits = hits.getTotalHits(); //查询命中总数
float maxScore = hits.getMaxScore(); //查询命中的最高分数
//嵌套在SearchHits可以迭代获取单个搜索结果中
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
//使用SearchHit做一些事情
}
//通过SearchHit还可以获取 返回数据 的索引、类型、docId和得分等基本信息
String index = hit.getIndex();
String type = hit.getType();
String id = hit.getId();
float score = hit.getScore();
//hit还可以以Json字符串或Map的形式返回数据
String sourceAsString = hit.getSourceAsString();
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String documentTitle = (String) sourceAsMap.get("title");
List<Object> users = (List<Object>) sourceAsMap.get("user");
Map<String, Object> innerObject = (Map<String, Object>) sourceAsMap.get("innerObject");
指定排序
sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC)); //按分数(即匹配度)排序
sourceBuilder.sort(new FieldSortBuilder("_uid").order(SortOrder.ASC)); //通过指定字段来排序
排序有两种排序方式,第一通过ScoreSortBuilder实现按分数(即匹配度)排序
第二种方式通过指定字段来排序,如上图所示通过“_uid”字段排序
关闭检索
有时候我们只想要知道到底匹配了多少条具体,但不关系具体每条记录的内容,这个时候我们可以选择关闭检索,不去查询每天数据的内容,可通过如下方式实现:
sourceBuilder.fetchSource(false);
关闭检索后,运行程序输出如下

只返回了总记录数,遍历输出每条数据均为 null
另外还可以通过sourceBuilder接受一个或多个数组,来控制要要返回哪些字段,排除哪些字段。具体实现如下,第一个数组参数为要接受的字段,第二个数组参数为要排除的内容:
String[] includeFields = new String[] {"title", "user", "innerObject.*"};
String[] excludeFields = new String[] {"_type"};
sourceBuilder.fetchSource(includeFields, excludeFields);
高亮显示
通过向SearchSourceBuilder添加HighlightBuilder示例可添加高亮显示功能
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
HighlightBuilder highlightBuilder = new HighlightBuilder();
HighlightBuilder.Field highlightTitle = new HighlightBuilder.Field("title");
highlightTitle.highlighterType("unified"); //字段高亮显示类型,默认用标签包裹高亮字词
highlightBuilder.field(highlightTitle);
searchSourceBuilder.highlighter(highlightBuilder);
以上只是在查询中加入高亮显示的功能,那么我们如何在查询结果中获取呢,通过SearchHit的getHighlightFields()方法获取我们需要关键内容:
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits.getHits()) {
Map highlightFields = hit.getHighlightFields();
HighlightField highlight = highlightFields.get("title");
Text[] fragments = highlight.fragments();
String fragmentString = fragments[0].string();
}
聚合操作
public void aggregation(){
RestHighLevelClient client = elasticClient.getRestHighLevelClient();
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder aggregation = AggregationBuilders.terms("by_sex")
.field("sex.keyword"); //若不加keyword,在text类型上进行聚合操作时会报错
aggregation.subAggregation(AggregationBuilders.avg("avg_age")
.field("age")); //avg_age 为子聚合名称,名称可随意
searchSourceBuilder.aggregation(aggregation);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = null;
try {
searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
Aggregations aggregations = searchResponse.getAggregations();
Terms byCompanyAggregation = aggregations.get("by_sex");
Terms.Bucket elasticBucket = byCompanyAggregation.getBucketByKey("女性");
Avg averageAge = elasticBucket.getAggregations().get("avg_age");
double avg = averageAge.getValue();
System.out.println("女性平均年龄:"+avg);
}
ElasticSearch High Level REST API【2】搜索查询的更多相关文章
- ElasticSearch High Level REST API【5】使用模板搜索
ElasticSearch Rest高级API 提供了多种搜索方式,除了前面讲到的search查询,ElasticSearch 还提供了通过模板搜索查询.我个人比较喜欢这种方式. 我们可以通过脚本预选 ...
- ElasticSearch High Level REST API【4】多搜索
1.Multi-Search多搜索请求 Multi-Search可同时添加多个search搜索请求,并行地在一个http请求中执行多个搜索请求,相较多次单请求查询可提升查询效率.ES客户掉通过mget ...
- ElasticSearch High Level REST API【6】获取集群信息
ElasticSearch 可以通过info()方法检索群集信息: public void info(){ RestHighLevelClient client = elasticClient.get ...
- ElasticSearch High Level REST API【3】Scroll 滚屏
ES中提供了 FROM/SIZE 分页,但这种分页有性能瓶颈. Scroll会以间隔时间滚屏的方式返回全部的查询数据,可以作为数据量很大的情况下,分页的一个替代方案 完整的示例如下: public v ...
- ElasticSearch High Level REST API【1】文档基本操作
获取ES客户端 ES的提供了四种Java客户端,分别为节点客户端(node client).传输客户端(Transport Client).低级REST客户端.高级REST客户端. 节点客户端作为集群 ...
- ElasticSearch High Level REST API【7】聚合
获取平均值聚合示例,最大值.最小值.求和类似 public void aggregation(){ RestHighLevelClient client = elasticClient.getRest ...
- Elasticsearch java api 基本搜索部分详解
文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...
- Elasticsearch核心技术(五):搜索API和搜索运行机制
本文将从数据存储和搜索的角度简单分析Elasticsearch的搜索运行机制,主要涉及搜索API.搜索机制.存在问题和解决方案. 4.1 Search API Search API允许用户执行一个搜索 ...
- 第四部分 数据搜索之使用HBASE的API实现条件查询
因为数据清洗部分需要用到Mapreduce,所以先解决hbase的问题,可以用命令先在hbase存一下简单的数据进行查询,之后只要替换数据就可以实现了原本功能 在看该部分前,确保Hase API看了, ...
随机推荐
- Unity 行为树-基础
.前言 Unity里面的行为树又名BehaviorTree,最常用在NPC的敌人逻辑中. 二.基础说明(转载) 1.行为树的调用时间为每帧: 2.每个节点的状态只能下面3个中的其一:成功Success ...
- NppFTP小插件的使用
大家在Linux系统中配置运行环境时,一定会遇到相关配置文件的修改,虽说在Linux系统中可以使用vi,vim的命令进行文本编辑,但是操作起来还是没有在Windows系统中用的爽,特别是操作大文本量的 ...
- redis常用
redis的key和string类型value限制均为512MB
- Unity www动态加载网上图片
一. 1.新建一个UGUI的Button,删掉它的Image组件,添加一个Raw Image组件.如图: 由于删除了Image组件,所以画圈的位置是空的,运行后会自动把Raw Image添加到那里. ...
- Ubuntu16.04 下如何安装和卸载Google Chrome【亲测有效】
一.安装 1.将下载源添加到系统源中. sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.li ...
- HTTPS和SSL证书
1. HTTPS工作原理 HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,(目的是安全的获得对称密钥用户后续传输加密)过程的简单描述如下: a).浏览器讲自己支持的多个加 ...
- Spring事务管理的注解方式
使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制 ...
- jstack的使用方法
背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高 ...
- spring batch 以游标的方式 数据库读取数据 然后写入目标数据库
前面关于Spring Batch的文章,讲述了SpringBatch对Flat.XML等文件的读写操作,本文将和大家一起讨论Spring Batch对DB的读写操作.Spring Batch对DB数据 ...
- mysql登陆远程数据库
1.登陆mysql 2.e mysql; 3.比如用户名密码为root/root. 你想root使用root从任何主机连接到mysql服务器的话. @’ ’后面加ip地址一般般为localhost或者 ...