Elasticsearch 4j 的3种客户端

注 -这里的 4j 指(for java)对于java

简易讲就是使用java操作elasticsearch,人家封装了3个插件,这是分析为啥使用本文标题的rest-high-level

三个客户端分别是:

  • JAVA API Client
  • JAVA Low Level Rest Client
  • JAVA High Level Rest Client

头一个客户端和后两个有本质区别,在于Api Client使用9300端口连接Es(以下简称Elasticsearch为Es),使用Netty在传输层建立连接

后两个都是使用9200端口连接Es,通过Http请求建立连接
Low和High的区别可以简易理解为Low就是不好用但是更底层,High就是好用代码封装的更厚

Api Client依赖Netty且不走Http协议,不是我们的最优选择,后两个显然High比Low更高大上更好用,事实也正式如此,可以将Low看作JDBC将High看为Mybatis

rest-high-level安装

导入依赖

默认使用maven环境,直接导入依赖即可
需要注意的是版本号最好和Es的版本对应

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>

编写配置

public static final RequestOptions COMMON_OPTIONS;

static {
    RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
    COMMON_OPTIONS = builder.build();
}

@Bean
public RestHighLevelClient esRestClient() {
    return new RestHighLevelClient(
            RestClient.builder(
                    new HttpHost("192.168.1.107", 9200, "http")
            )
    );
}

首先创建静态常量COMMON_OPTIONS,使用静态代码块为其赋值,后面查询时需要使用
往SpringIoc容器中注入一个Bean,也就是我们需要操作的对象RestHighLevelClient的Bean

简易查询

执行简易查询

使用rest-high-level实现查询大约分为3步

  1. 准备客户端
  2. 准备检索请求
  3. 使用客户端发送检索请求

准备客户端
这一步非常简单,直接将我们之前配置好的客户端注入就好

@Autowired
private RestHighLevelClient client;

准备检索请求
在rest-high-level中检索请求被封装为SearchRequest对象,我们只需要创建一个SearchRequest对象即可

SearchRequest searchRequest = new SearchRequest();

发送检索请求
使用client发送检索请求需要两个参数,分别时检索请求和检索参数
请求我们上部创建好了,而参数是我们在配置类中的静态常量

client.search(searchRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);

检索请求的构建

我们上述的例子演示了一个简单的检索请求的发送,下面即是构建一个简易请求的方法
在Es中的检索有很多的方案,这里就简易罗列3个常用的:must(模糊匹配)、filter(过滤)、agg(聚合)

must(模糊匹配)

首先我们需要调用searchRequest实例下的query方法添加一个检索条件
传入的检索条件也被封装为了一个对象QueryBuilder
使用Es提供的QueryBuilders工具类可以快速创建BoolQueryBuilder的实例

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

调用BoolQueryBuilder的实例下的must方法即可添加一个模糊匹配的检索条件
这个方法也需要传入参数,这个参数也为QueryBuilder类型这里我们可以传入MatchQuery类型来实现模糊匹配的要求

完整代码如下

// 创建检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 创建一个查询条件
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 在must下添加match条件完成模糊匹配
boolQuery.must(QueryBuilders.matchQuery("title", "value"));
// 将条件添加入检索条件
searchSourceBuilder.query(boolQuery);

filter(过滤)

过滤和must差不太多,同属于查询
具体代码如下

// 创建检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 创建一个查询条件
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 在filter下添加term条件完成模糊匹配
boolQuery.filter(QueryBuilders.termQuery("title", "value"));
// 将条件添加入检索条件
searchSourceBuilder.query(boolQuery);

agg(聚合)

首先通过聚合工具类直接创建出一个聚合

TermsAggregationBuilder myAgg = AggregationBuilders.terms("my_agg");

设置聚合参数,若有其他参数可继续链式调用添加

barendAgg.field("title").size(10);

添加聚合到检索条件

searchSourceBuilder.aggregation(myAgg);

若需要子聚合,则调用聚合myAgg下的subAggregation方法为其添加即可,创建聚合的方法是相同的,这里就不做罗列

总结

这里仅对Elasticsearch客户端的简易查询操作进行介绍,包括嵌入式结构的处理、查询结果的解析等问题,都没有提及,这篇文章就仅作抛砖引玉,具体的用法都可以查询Es的官方文档。

Q.E.D.


深至缄默,如云漂泊