ES Search API
Search API
搜索请求
SearchRequest
用于与搜索文档、聚合、suggestions相关的任何操作,还提供了在结果文档上请求高亮的方法。
在最基本的表单中,我们可以向请求添加查询:
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder);
- 创建
SeachRequest
,没有参数,这将针对所有索引运行。 - 大多数搜索参数都添加到
SearchSourceBuilder
中,它为搜索请求body中的所有内容提供了setter。 - 将
match_all
查询添加到SearchSourceBuilder
。 - 将
SearchSourceBuilder
添加到SeachRequest
。
可选参数
我们先来看一下SearchRequest
的一些可选参数:
SearchRequest searchRequest = new SearchRequest("posts");
searchRequest.types("doc");
- 将请求限制为一个索引。
- 将请求限制为一个类型。
还有一些其他有趣的可选参数:
searchRequest.routing("routing");
- 设置路由参数。
searchRequest.indicesOptions(IndicesOptions.lenientExpandOpen());
- 设置
IndicesOptions
控制如何解析不可用的索引以及如何扩展通配符表达式。
searchRequest.preference("_local");
- 使用首选项参数,例如执行搜索以优先选择本地碎片,默认是随机的跨碎片。
使用SearchSourceBuilder
控制搜索行为的大多数选项都可以在SearchSourceBuilder
上设置,它包含或多或少与Rest API的搜索请求body中等效的选项。
以下是一些常见选项的几个示例:
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("user", "kimchy"));
sourceBuilder.from(0);
sourceBuilder.size(5);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
- 使用默认选项创建
SearchSourceBuilder
。 - 设置查询,可以是任何类型的
QueryBuilder
。 - 设置确定结果要从哪个索引开始搜索的
from
选项,默认为0
。 - 设置确定搜索命中返回的数的
size
选项,默认为10
。 - 设置一个可选的超时,控制允许搜索的时间。
在此之后,只需将SearchSourceBuilder
添加到SearchRequest
:
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("posts");
searchRequest.source(sourceBuilder);
构建查询
使用QueryBuilder
对象创建搜索查询,QueryBuilder存在对于Elasticsearch的查询DSL支持的每种搜索查询类型。
可以使用其构造函数创建QueryBuilder
:
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("user", "kimchy");
- 创建一个在字段“user”上匹配文本“kimchy”的全文匹配查询。
创建后,QueryBuilder
对象提供了配置其创建的搜索查询选项的方法:
matchQueryBuilder.fuzziness(Fuzziness.AUTO);
matchQueryBuilder.prefixLength(3);
matchQueryBuilder.maxExpansions(10);
- 在匹配查询上启用模糊匹配。
- 在匹配查询上设置前缀长度选项。
- 设置最大扩展选项以控制查询的模糊过程。
也可以使用QueryBuilders
实用程序类创建QueryBuilder
对象,此类提供了可用于使用流畅的编程样式创建QueryBuilder
对象的辅助方法:
QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("user", "kimchy")
.fuzziness(Fuzziness.AUTO)
.prefixLength(3)
.maxExpansions(10);
无论用于创建它的方法是什么,都必须将QueryBuilder
对象添加到SearchSourceBuilder
,如下所示:
searchSourceBuilder.query(matchQueryBuilder);
构建查询页面提供了所有可用的搜索查询的列表及其相应的QueryBuilder
对象和QueryBuilders
辅助方法。
指定排序
SearchSourceBuilder
允许添加一个或多个SortBuilder
实例,有四种特殊的实现(Field-,Score-,GeoDistance-和ScriptSortBuilder)。
sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
sourceBuilder.sort(new FieldSortBuilder("_uid").order(SortOrder.ASC));
- 按
_score
降序排序(默认值)。 - 也可以按
_id
字段进行升序排序。
源过滤
默认情况下,搜索请求会返回文档_source
的内容,但与Rest API中的内容一样,你可以覆盖此行为,例如,你可以完全关闭_source
检索:
sourceBuilder.fetchSource(false);
该方法还接受一个或多个通配符模式的数组,以控制以更精细的方式包含或排除哪些字段:
String[] includeFields = new String[] {"title", "user", "innerObject.*"};
String[] excludeFields = new String[] {"_type"};
sourceBuilder.fetchSource(includeFields, excludeFields);
请求高亮
通过在SearchSourceBuilder
上设置HighlightBuilder
,可以实现高亮搜索结果,通过将一个或多个HighlightBuilder.Field
实例添加到HighlightBuilder
,可以为每个字段定义不同的高亮行为。
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
HighlightBuilder highlightBuilder = new HighlightBuilder();
HighlightBuilder.Field highlightTitle =
new HighlightBuilder.Field("title");
highlightTitle.highlighterType("unified");
highlightBuilder.field(highlightTitle);
HighlightBuilder.Field highlightUser = new HighlightBuilder.Field("user");
highlightBuilder.field(highlightUser);
searchSourceBuilder.highlighter(highlightBuilder);
- 创建一个新的
HighlightBuilder
。 - 为
title
字段创建字段高光色。 - 设置字段高光色类型。
- 将字段高光色添加到高亮构建器。
Rest API文档中有许多选项需要详细说明,Rest API参数(例如pre_tags
)通常由具有相似名称的setter更改而来(例如#preTags(String ...)
)。
稍后可以从SearchResponse
中检索高亮的文本片段。
请求聚合
可以通过先创建适当的AggregationBuilder
然后在SearchSourceBuilder
上设置聚合来将聚合添加到搜索中,在以下示例中,我们在公司名称上创建terms
聚合 ,使用子聚合在公司员工平均年龄上:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder aggregation = AggregationBuilders.terms("by_company")
.field("company.keyword");
aggregation.subAggregation(AggregationBuilders.avg("average_age")
.field("age"));
searchSourceBuilder.aggregation(aggregation);
构建聚合页面提供了所有可用的聚合的列表及其对应的AggregationBuilder
对象和AggregationBuilders
辅助方法。
稍后我们将看到如何访问SearchResponse
中的聚合。
请求Suggestion
要向搜索请求添加建议,请使用从SuggestBuilders
工厂类中可轻松访问的SuggestionBuilder
的实现之一,Suggestion构建器需要添加到顶级SuggestBuilder
,它本身可以在SearchSourceBuilder
上设置。
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SuggestionBuilder termSuggestionBuilder =
SuggestBuilders.termSuggestion("user").text("kmichy");
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("suggest_user", termSuggestionBuilder);
searchSourceBuilder.suggest(suggestBuilder);
- 为
user
字段和文本kmichy
创建一个新的TermSuggestionBuilder
。 - 添加suggestion构建器并将其命名为
suggest_user
。
我们稍后将看到如何从SearchResponse
中检索suggestion。
分析查询和聚合
分析API可用于分析特定搜索请求的查询和聚合的执行情况,为了使用它,必须在SearchSourceBuilder
上将profile
标志设置为true
:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.profile(true);
执行SearchRequest
后,相应的SearchResponse
将包含分析结果。
同步执行
以下列方式执行SearchRequest
时,客户端在继续执行代码之前等待返回SearchResponse
:
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
异步执行
执行SearchRequest
也可以以异步方式完成,以便客户端可以直接返回,用户需要通过将请求和监听器传递给异步搜索方法来指定响应或潜在的故障如何处理:
client.searchAsync(searchRequest, RequestOptions.DEFAULT, listener);
- 要执行的
SearchRequest
和执行完成时要使用的ActionListener
。
异步方法不会阻塞并且立即返回,完成后,如果执行成功完成则使用onResponse
方法回调ActionListener
,如果失败则使用onFailure
方法。
SearchResponse
的典型监听器如下所示:
ActionListener<SearchResponse> listener = new ActionListener<SearchResponse>() {
@Override
public void onResponse(SearchResponse searchResponse) {
}
@Override
public void onFailure(Exception e) {
}
};
onResponse
:执行成功完成时调用。onFailure
:在整个SearchRequest
失败时调用。
SearchResponse
通过执行搜索返回的SearchResponse
提供有关搜索执行本身以及对返回文档的访问的详细信息,首先,有关于请求执行本身的有用信息,例如HTTP状态码,执行时间或请求是提前终止还是超时:
RestStatus status = searchResponse.status();
TimeValue took = searchResponse.getTook();
Boolean terminatedEarly = searchResponse.isTerminatedEarly();
boolean timedOut = searchResponse.isTimedOut();
其次,响应还通过提供有关搜索影响的碎片总数以及成功与不成功碎片的统计信息的碎片级别执行的信息,可以通过在ShardSearchFailures
上迭代数组来处理可能的失败,如下例所示:
int totalShards = searchResponse.getTotalShards();
int successfulShards = searchResponse.getSuccessfulShards();
int failedShards = searchResponse.getFailedShards();
for (ShardSearchFailure failure : searchResponse.getShardFailures()) {
// failures should be handled here
}
检索SearchHits
要访问返回的文档,我们需要先获取响应中包含的SearchHits
:
SearchHits hits = searchResponse.getHits();
SearchHits
提供有关所有匹配的全局信息,例如总命中数或最高分数:
long totalHits = hits.getTotalHits();
float maxScore = hits.getMaxScore();
嵌套在SearchHits
中的是可以迭代的单个搜索结果:
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
// do something with the SearchHit
}
SearchHit
提供对每个搜索命中的索引、类型、docId和分数等基本信息的访问:
String index = hit.getIndex();
String type = hit.getType();
String id = hit.getId();
float score = hit.getScore();
此外,它还允许你以简单的JSON-String或键/值对映射的形式返回文档源,在此映射中,常规字段由字段名称键控并包含字段值,多值字段作为对象列表返回,嵌套对象作为另一个键/值映射返回,这些案例需要相应地进行投射:
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");
检索高亮
如果需要,可以从结果中的每个SearchHit
检索高亮的文本片段,命中对象提供对HighlightField
实例的字段名称映射的访问,每个实例包含一个或多个高亮的文本片段:
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits.getHits()) {
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField highlight = highlightFields.get("title");
Text[] fragments = highlight.fragments();
String fragmentString = fragments[0].string();
}
- 获取
title
字段的高亮。 - 获取包含高亮的字段内容的一个或多个片段。
检索聚合
可以从SearchResponse
检索聚合,先获取聚合树的根,Aggregations
对象,然后按名称获取聚合。
Aggregations aggregations = searchResponse.getAggregations();
Terms byCompanyAggregation = aggregations.get("by_company");
Bucket elasticBucket = byCompanyAggregation.getBucketByKey("Elastic");
Avg averageAge = elasticBucket.getAggregations().get("average_age");
double avg = averageAge.getValue();
- 获取
by_company
的terms
聚合。 - 获取使用
Elastic
键入的桶。 - 从该桶中获取
average_age
子聚合。
请注意,如果按名称访问聚合,则需要根据所请求的聚合类型指定聚合接口,否则将引发ClassCastException
:
Range range = aggregations.get("by_company");
- 这将引发异常,因为“by_company”是一个
terms
聚合,但我们尝试将其作为range
聚合进行检索。
还可以将所有聚合作为由聚合名称键入的映射进行访问,在这种情况下,需要显式地进行到正确聚合接口的转换:
Map<String, Aggregation> aggregationMap = aggregations.getAsMap();
Terms companyAggregation = (Terms) aggregationMap.get("by_company");
还有一些getter将所有顶级聚合作为列表返回:
List<Aggregation> aggregationList = aggregations.asList();
最后但并非最不重要的是,你可以迭代所有聚合,然后例如决定如何根据类型进一步处理它们:
for (Aggregation agg : aggregations) {
String type = agg.getType();
if (type.equals(TermsAggregationBuilder.NAME)) {
Bucket elasticBucket = ((Terms) agg).getBucketByKey("Elastic");
long numberOfDocs = elasticBucket.getDocCount();
}
}
检索suggestions
要从SearchResponse
获取suggestions,请使用Suggest
对象作为入口点,然后检索嵌套的suggestion对象:
Suggest suggest = searchResponse.getSuggest();
TermSuggestion termSuggestion = suggest.getSuggestion("suggest_user");
for (TermSuggestion.Entry entry : termSuggestion.getEntries()) {
for (TermSuggestion.Entry.Option option : entry) {
String suggestText = option.getText().string();
}
}
- 使用
Suggest
类访问suggestions。 - 可以通过名称检索suggestions,你需要将它们分配给正确类型的Suggestion类(此处为
TermSuggestion
),否则抛出ClassCastException
。 - 迭代suggestion条目。
- 在一个条目中迭代选项。
检索性能分析结果
使用getProfileResults()
方法从SearchResponse
检索分析结果,此方法返回包含SearchSquest
执行中涉及的每个碎片的ProfileShardResult
对象的Map
,ProfileShardResult
使用唯一标识分析结果对应的碎片的键存储在Map
中。
下面是一个示例代码,显示如何迭代每个碎片的所有分析结果:
Map<String, ProfileShardResult> profilingResults =
searchResponse.getProfileResults();
for (Map.Entry<String, ProfileShardResult> profilingResult : profilingResults.entrySet()) {
String key = profilingResult.getKey();
ProfileShardResult profileShardResult = profilingResult.getValue();
}
- 从
SearchResponse
中检索ProfileShardResult
的Map
。 - 如果键已知,则可以通过碎片的键检索分析结果,否则迭代所有分析结果可能更简单。
- 检索标识
ProfileShardResult
属于哪个碎片的键。 - 检索给定碎片的
ProfileShardResult
。
ProfileShardResult
对象本身包含一个或多个查询分析结果,每个查询针对基础Lucene索引执行:
List<QueryProfileShardResult> queryProfileShardResults =
profileShardResult.getQueryProfileResults();
for (QueryProfileShardResult queryProfileResult : queryProfileShardResults) {
}
- 检索
QueryProfileShardResult
的列表。 - 迭代每个
QueryProfileShardResult
。
每个QueryProfileShardResult
都提供对详细查询树执行的访问,作为ProfileResult
对象列表返回:
for (ProfileResult profileResult : queryProfileResult.getQueryResults()) {
String queryName = profileResult.getQueryName();
long queryTimeInMillis = profileResult.getTime();
List<ProfileResult> profiledChildren = profileResult.getProfiledChildren();
}
- 迭代分析结果。
- 检索Lucene查询的名称。
- 检索执行Lucene查询所花费的时间。
- 检索子查询的分析结果(如果有)。
Rest API文档包含有关分析查询的更多信息以及查询分析信息的说明。
QueryProfileShardResult
还可以访问Lucene收集器的分析信息:
CollectorResult collectorResult = queryProfileResult.getCollectorResult();
String collectorName = collectorResult.getName();
Long collectorTimeInMillis = collectorResult.getTime();
List<CollectorResult> profiledChildren = collectorResult.getProfiledChildren();
- 检索Lucene收集器的分析结果。
- 检索Lucene收集器的名称。
- 检索执行Lucene收集器所花费的时间。
- 检索子收集器的分析结果(如果有)。
Rest API文档包含有关Lucene收集器的分析信息的更多信息。
以与查询树执行非常类似的方式,QueryProfileShardResult
对象提供对详细聚合树执行的访问:
AggregationProfileShardResult aggsProfileResults =
profileShardResult.getAggregationProfileResults();
for (ProfileResult profileResult : aggsProfileResults.getProfileResults()) {
String aggName = profileResult.getQueryName();
long aggTimeInMillis = profileResult.getTime();
List<ProfileResult> profiledChildren = profileResult.getProfiledChildren();
}
- 检索
AggregationProfileShardResult
。 - 迭代聚合分析结果。
- 检索聚合的类型(对应于用于执行聚合的Java类)。
- 检索执行Lucene收集器所花费的时间。
- 检索子聚合的分析结果(如果有)。
Rest API文档包含有关分析聚合的更多信息。
ES Search API的更多相关文章
- Elasticsearch 6.x版本全文检索学习之Search API
Elasticsearch 6.x版本全文检索学习之Search API. 1).Search API,实现对es中存储的数据进行查询分析,endpoind为_search,如下所示. 方式一.GET ...
- Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search)
原文:Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...
- Search API 官方文档 可以用了查看自己的app
Search API October 24, 2012 - HTTPS is now supported for Search and Lookup requests. Please update y ...
- ElasticSearch Search API 简介
REST request URI curl 'localhost:9200/bank/_search?q=*&pretty' 1. localhost:9200/bank/_search,以 ...
- Elasticsearch学习笔记(二)Search API 与 Query DSL
一. Search API eg: GET /mall/product/_search?q=name:productName&sort=price desc 特点:search的请求参数都是以 ...
- 通过Google Custom Search API 进行站内搜索
今天突然想把博客的搜索改为google的站内搜索,印象中google adsense中好像提高这个站内搜索的代码,但苦逼的是google adsense帐号一直审核不通过,所以只能通过google c ...
- 申请Bing Search API
地址:https://datamarket.azure.com/home 没有帐号先注册一个,然后登录. 1:在数据中订阅Bing Search API,如果找不到就使用这个地址: https://d ...
- Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介)
原文:Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介) 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...
- Twitter search API
Twitter crawler 与sina 微博类似,使用twitter api之前,首先要有twitter的账号,在twitter developer中创建应用(https://apps.twitt ...
随机推荐
- JS高级---案例:贪吃蛇小游戏
案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...
- 如何通过源码包的方式在linux安装python36
背景: python34的安装非常简单,直接用yum就可以安装,但是安装最新版的python36通过yum方式是不行的,需要通过源码包进行安装 具体步骤如下: 1.安装openssl静态库[pip3安 ...
- win7安装mysql数据库
1. 软件准备,以64位系统为例如果是32位的下载32位压缩包即可] https://dev.mysql.com/downloads/mysql/ 2.下载解压到本地,将解压路径的bin目录配置到环境 ...
- ACM-ICPC实验室20.2.21测试-图论(二)
A.患者的编号 给出一个有向图,要求你输出字典序最小的拓扑排序. 常规拓扑排序是做不了的,正解是反向建图,同时用大根堆的优先队列维护,保证每次优先访问编号大的结点,再反向输出~ #include< ...
- eclipse从svn导入静态文件
1.从eclipse 选择 导入 2.选择仓库和项目,选择finish 3.选择project项目导出
- 前端——语言——Core JS——《The good part》读书笔记——第六章节(Arrays)
本章介绍数组的内容,Java中的数组在创建时,会分配同等大小的内存空间,一旦创建数组的大小无法改变,如果数据超过数组大小,会进行扩容操作.并且数组的元素类型在创建时必须是已知的,而且只能存放相同数据类 ...
- Linux - CentOS7 命令行快捷键简介
1. 概述 CentOS7 下输入命令的一些快捷键 2. 快捷键 1. 移动 单个字符 ctrl + b/f 单个单词 alt + b/f 行首行尾 ctrl + a/e 2. 编辑 删除单个字符 c ...
- 从TCL欲成JDI股东看,面板行业进入“群架”时代
当下,屏幕早已成为第一入口.PC.智能手机.平板电脑.电视.家庭智能终端.智慧交通.智能穿戴设备.汽车中控大屏--种种设备都是以屏幕为最重要的视觉呈现方式,让人们在一个个奇幻世界中畅游.也正是因为屏幕 ...
- Azure IoT Hub 十分钟入门系列 (1)- 10分钟带你了解Azure IoT Hub 并创建IoT Hub
建议您先对<Azure 上 IoT 整体解决方案概览 >进行了解. 本文主要分享一个案例: 10分钟-了解Azure IoT Hub并创建Azure IoT Hub 本文主要有如下内容: ...
- 读书笔记, Python - python-tricks-buffet-awesome-features
To be a Pythonista 1. assert syntax: assert expression1 [",", expression2] 大致相当于 if __debu ...