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>() {@Overridepublic 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_companyterms聚合。
  • 获取使用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对象的MapProfileShardResult使用唯一标识分析结果对应的碎片的键存储在Map中。

下面是一个示例代码,显示如何迭代每个碎片的所有分析结果:

Map<String, ProfileShardResult> profilingResults =searchResponse.getProfileResults(); 
for (Map.Entry<String, ProfileShardResult> profilingResult : profilingResults.entrySet()) { String key = profilingResult.getKey(); ProfileShardResult profileShardResult = profilingResult.getValue(); }
  • SearchResponse中检索ProfileShardResultMap
  • 如果键已知,则可以通过碎片的键检索分析结果,否则迭代所有分析结果可能更简单。
  • 检索标识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文档包含有关分析聚合的更多信息。

转载于:https://www.cnblogs.com/zeenzhou/p/11502924.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

silverlight 跨域socket

http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx一切都是临时的&#xff0c;beta2相对于beta1改了很多&#xff0c;不知道正式发布时是否还会改变。翻译的作用是备忘。Silverlight 2 beta 支持2种访问远程服务器的方式&#xff1a;System.Net命名空间中的WebCli…

OCP-052考试题库汇总(54)-CUUG内部解答版

USER1 grants SELECT and UPDATE privileges on USER1.EMP to USER2。 SYS executes this command&#xff1a; SQL> REVOKE SELECT ON user1.emp FROM user1; What will be the outcome? A)It will succeed and USER2 will be unable to perform SELECT on USER1.EMP B)It…

ES 创建mapping

mapping的写入与查看首先创建一个索引&#xff1a; curl -XPUT "http://erp2.es.kd1.pagoda.com.cn:80/erp_stock_index"{"acknowledged":true} 现在只创建了一个索引&#xff0c;并没有设置mapping&#xff0c;查看一下索引mapping的内容&#xff1a; cur…

关于C语言野指针的问题

typedef struct{int id;char username [6];} user;int main(void){user *userr;strncpy(userr->username, "hello", 3);strcat(userr->username, ""0");printf("userr->username%s."n", userr->username);return 0;} 便已…

简单 屏蔽 assert

简介 屏蔽 assert 如何实现 Makefile 中加 CFLAGS -DNDEBUG 或者 gcc -DNDEBUG 转载于:https://www.cnblogs.com/eat-too-much/p/11512524.html

多核分布式队列的实现:“偷”与“自私”的运用(1)

多核分布式队列的实现&#xff1a;"偷"与"自私"的运用 在讨论本文的正题前&#xff0c;不得不先说一些闲话&#xff0c;嫌哆嗦者可以跳过"前言"部分不读。1. 前言在发表了"老子是伟大的多核计算科学家" &#xff08;链接&#xff1a;[…

近期刷题记录表

9月14日&#xff1a;   luogu P1627 [CQOI2009]中位数 题意&#xff1a;给出1~n的一个排列&#xff0c;统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后&#xff0c;位于中间的数。 题解&#xff1a;根据中位数的性质&#xff0c…

《性能测试从零开始--LoadRunner入门》读书笔记(四)

终于看完了澳网的赛事了&#xff0c;今天要把第五章的读书笔记完成&#xff0c;哈哈。 4.参数化 书中花了不少力气说明这方面的用法&#xff0c;可见参数化在整个脚本的制作过程中的重要性。在这个session开始的时候&#xff0c;书使用了不少的废话去说明白参数化的意义和参数化…

STM32CubeMX

博客&#xff1a;https://blog.csdn.net/wofreeo/article/details/88990192 https://blog.csdn.net/xuquanlin_1680/article/details/80499977 转载于:https://www.cnblogs.com/panda-w/p/11523405.html

我的QTP 9.5装不上去:a previos installation has not competed

解决方法&#xff1a; 1. Open the %TEMP% folder (in the Start -> Run dialog, type %TEMP% and click Enter).2. In this folder, search for a file named "Prereq_Mgr.HP_QuickTest_Professional_9.5.log". This file is created by the inst…

转 Git生成SSH

SSH keys SSH key 可以让你在你的电脑和Code服务器之间建立安全的加密连接。 先执行以下语句来判断是否已经存在本地公钥&#xff1a; cat ~/.ssh/id_rsa.pub 如果你看到一长串以 ssh-rsa或 ssh-dsa开头的字符串, 你可以跳过 ssh-keygen的步骤。 提示: 最好的情况是一个密码对应…

u boot 驱动完成

很久没有更新了&#xff0c;终于在年前完成了u-boot下无线网卡的驱动移植&#xff0c;其实驱动移植很简单&#xff0c;驱动里面大部分都是自己的逻辑&#xff0c;真正和系统相关的就是系统的一点点接口&#xff0c;只需要把这些一点点接口都替换掉就可以实现了&#xff0c;当然…

使用Git Flow进行版本控制

重置 # force reset $ git flow init -f 转载于:https://www.cnblogs.com/ww01/p/11527124.html

我的RSS我做主:My RSS

昨天晚上通过google reader 浏览自己的网站时发现&#xff0c;Rss输出的内容比较简单&#xff0c;没有我想输出内容,诸如“评论数”、“评论文章”&#xff0c;“永久链接”等等。修改wordpress RSS 输出函数话&#xff0c;每次更新更新wordpress又要重新改一次&#xff0c;比较…

luogu P3407 散步 二分答案

题目描述 一条道路上&#xff0c;位置点用整数A表示。 当A0时&#xff0c;有一个王宫。当A>0&#xff0c;就是离王宫的东边有A米&#xff0c;当A<0&#xff0c;就是离王宫的西边有A米。 道路上&#xff0c;有N个住宅从西向东用1-N来标号。每个住宅有一个人。住宅只会存在…

C# 视频监控系列(2):客户端——封装API

前言 本章主要是在C#封装的海康DVR客户端SDK 的代码上修改的&#xff0c;并参考《Hikvision 板卡网络开发包编程手册V4.7.pdf》补上更完整的注释&#xff0c;并且参照VC源码做了小部分修改。 参考 1. C#封装的海康DVR客户端SDK 系列 1. C# 视频监控系列&#xff08;1&…

java继承 、方法重写、重写toString方法

1.Java的继承&#xff0c;关键词Extends 1 package cn.mwf.oo;2 3 public class TextExtends {4 public static void main(String[] args) {5 Student s new Student("侠客小飞", 60, "计算机科学与技术");6 s.rest();7 s.st…

网络攻击与防御 实验1

做实验的截图 转载于:https://www.cnblogs.com/ma1998/p/11536582.html

ActiveRecord.JS 与 Google Gears

ActiveRecord是仿照Rails的ActiveRecord写的js orm框架&#xff0c; 我使用它操作gears 的sqlite数据库。看起来不错&#xff0c;但是文档比较恶心&#xff0c;我按照文档的操作ActiveRecord.define方法根本就不能用&#xff0c;去邮件列表里一看&#xff0c;有个老外和我一样的…

SQL注入原理-手工联合注入查询技术

实验报告记录 得到实验结果 转载于:https://www.cnblogs.com/ma1998/p/11536959.html