本节主要内容是使用ES客户端Java High Level REST Client操作ES(推荐使用该客户端)。
是官方目前推荐使用的,适用于6.x以上的版本,要求JDK在1.8以上,可以很好的在大版本中进行兼容,并且该架包自身也包含中的方法,可以应对一些特需的情况进行特殊的处理, 它对于一些常用的方法封装Restful风格,可以直接对应操作名调用使用即可,支持同步和异步(Async)调用。
参考一
1、创建SearchRequest,不带参数,表示查询所有索引
2、添加大部分查询参数到 SearchSourceBuilder,接收QueryBuilders构建的查询参数
3、添加 match_all 查询到 SearchSourceBuilder
4、添加 SearchSourceBuilder 到 SearchRequest
控制搜索行为的大多数选项都可以在 SearchSourceBuilder 上设置,该构建器或多或少包含与Rest API 的search request中的选项等价的设置。下面是一些通用设置选项:
设置完上面 的SearchSourceBuilder ,只需要将其设置到 SearchRequest中即可。
构建查询参数QueryBuilder
使用QueryBuilder构建查询参数,QueryBuilder包括所有Elasticsearch’s Query DSL支持的类型。
可以使用QueryBuilde构造器创建一个QueryBuilder:
可以使用工具类QueryBuilders,采用流式编程的形式构建QueryBuilder
不管使用上述两种方式的哪种来创建QueryBuilder, QueryBuilder都必须按如下方式设置到SearchSourceBuilder.
Building Queries 页给出了所有的查询QueryBuilder及辅助类QueryBuilders的表达方式。
指定排序
SearchSourceBuilder允许增加一或多个排序参数SortBuilder,有四个具体实现FieldSortBuilder, ScoreSortBuilder, GeoDistanceSortBuilder 和 ScriptSortBuilder。
使用Source字段过滤
_source字段
默认情况下,查询请求会返回_source字段的全部内容,但是该行为可以被覆写,比如,你可以完全关掉该字段的索引(不推荐,该行为,原因参考上面的链接)
该方法fetchSource也可以接收组通配模式来以更细粒度地方式控制哪些字段被包含或者被排除。
搜索结果突出(Highlighting)
通过向 SearchSourceBuilder 设置 HighlightBuilder 可以实现查询高亮的效果。通过设置一个或多个 HighlightBuilder.Field 对象到HighlightBuilder 中实现不同的突出行为。
详细的选项可以参考Rest API的文档。
高亮的文本片断可以在下面的 later be retrieved SearchResponse中获取。
实际样例
请求聚合(Requesting Aggregations)
通过构建AggregationBuilder对象并设置到SearchSourceBuilder中可以实现聚合查询。
下面的例子创建了terms的聚合:聚合各公司下员工的平均年龄
Building Aggregations页给出了聚合对象AggregationBuilder及辅助类AggregationBuilders的对应关系及使用方式。
后面会介绍如何从SearchResponse中获取聚合结果。 access aggregations
请求建议Requesting Suggestions
在查询请求中可以设置请求Suggestions,通过使用SuggestBuilders辅助类,或者SuggestionBuilder构造器,将其设置到SuggestBuilder,最后将SuggestBuilder设置SearchSourceBuilder中。
后面会介绍如何从SearchResponse中检索建议retrieve suggestions
Profiling Queries和aggregations
Profile API可以配置某个具体的查询或聚合请求的执行过程。如果想使用该功能,需要将SearchSourceBuilder的开关打开。
SearchRequest执行后,SearchResponse会包含配置的执行信息。contain the profiling results
同步查询执行Synchronous execution
下面是同步查询执行方式,客户端会等待SearchResponse的结果返回后,才继续执行后面的代码。
high-level REST client 的同步请求可能抛出IOException。
异步查询执行Asynchronous execution
SearchRequest也可以以异步方式执行。用户需要指定listenert到异步请求中,告诉异步请求如何处理响应或潜在的错误。
searchRequest执行完成后会调用ActionListener
异步方式不会阻塞,当该异步调用结果后,ActionListener会被调用,如果执行成功,则onResponse会被调用,如果失败,则onFailure被调用。一个典型的search listener如下:
SearchResponse提供了查询执行的细节以及返回的文档结果。首先,SearchResponse包括当前查询的执行细节,比如HTTP响应码、执行时间、或者是否超时等:
其次,SearchResponse提供了查询涉及的分片统计信息,包含执行成功和执行失败的分片。执行的错误信息ShardSearchFailures可以通过如下方式迭代处理:
检索结果Retrieving SearchHits
为了获取到结果中的文档信息,我们首先要获取response中的搜索结果集SearchHits:
SearchHits提供了所有命中结果的全局信息,包括命中的总数或者最大的score:
SearchHits中的单个结果集可以迭代获取:
单个结果集SearchHit包含了一些基本信息:索引、文档ID、每个命中结果的score
此外,SearchHit可以以JSON或MAP形式返回文档的source信息。在Map中,普通的字段以字段名作为key,值为字段值。多值字段是以对象列表形式返回,嵌套对象,则以另一个map的形式返回。需要根据实际情况进行强转:
获取突出内容(Retrieving Highlighting)
如果设置了highlighting的请求,则返回的SearchHit中可以获取到突出的text文本片断。
获取聚合结果(Retrieving Aggregations)
首先从SearchResponse中获取聚合树aggregation tree的根,聚合对象Aggregations,然后可以根据名称获取聚合对象aggregation。
注意,如果使用名称获取Aggregations,需要指定aggregation 接口为请求里设置的aggregation 类型,否则会抛出ClassCastException 异常。
也可以以map的形式获取aggregations,key是aggregation名称。这种情况下,aggregation 接口需要显式的强转。
也有方式将所有top level aggregations以列表形式返回:
最后,可以迭代所有aggregations:
获取建议结果(Retrieving Suggestions)
为了从SearchResponse中获取suggestions,可以使用Suggest对象作为入口。
获取配置结果(Retrieving Profiling Results)
可以使用SearchResponse的getProfileResults()方法获取。返回结果为每个分片包装一个Map,值为ProfileShardResult对象。key是能唯一标识分片的信息。
ProfileShardResult包含一个或多个profile 结果:
每个QueryProfileShardResult 中可以获取ProfileResult对象列表:
QueryProfileShardResult也可以获取Lucene collectors的信息:
QueryProfileShardResult可以获取详细的aggregations tree执行信息:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/18167.html