ElasticSearch 使用详解:Java Elastics
ES 也提供了 Java 的接口。Java 是目前非常火爆流行的语言,本课时将主要介绍如何使用 ES 的 Java 接口,对 ES 进行操作,我们将对 Java Rest Client 的 Java High Level Rest Client 作为开发工具进行介绍。
我使用 IDEA 社区版作为开发工具,创建了一个 Spring Boot 项目。创建细节这里不过多介绍。
Maven 依赖
Maven 是个非常好用的包管理器工具,在 pom.xml 添加下面的 Maven 依赖,就可以将 ES 客户端引入到现在的开发环境中:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.1.1</version>
</dependency>
配置连接客户端
配置好 IP 地址与端口号,连接成功后,需要手动地关闭连接:
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")));
client.close();
JSON 定义方式
直接在开发中写 JSON 字符串感觉比较 low,我个人喜欢两种方式定义 JSON 对象——Map 和 XContentBuilder。Map 的方式定义起来确实很方便,而且可读性也很高;但是如果需要嵌套的关系就显得非常麻烦,特别是定义 DSL 的时候,多层嵌套聚合用 Map 表达起来就很繁琐。
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("user", "kimchy");
jsonMap.put("postDate", new Date());
jsonMap.put("message", "trying out Elasticsearch");
因此我更中意 XContentBuilder,一个 ES 定义的 JSON helper 类。用这个 helper 类,感觉就是在定义 JSON,嵌套表达起来也合理。后面将会使用 XContentBuilder 来作为数据对象或者 DSL 的 JSON 定义工具。
XContentBuilder builder = jsonBuilder()
.startObject()
.field("user", "kimchy").endObject()
.field("postDate", new Date())
.field("message", "trying out Elasticsearch")
.endObject().humanReadable(true);
String s = Strings.toString(builder);
Index 操作
Java 中封装了 IndexRequest 类,专门用来索引操作,先定义一个 JSON 对象,向 ES 中插入。
定义文档 ID,将 builder 或者 Map 数据放到 source 中,这里的 source 与 ES 中的 _source 字段含义差不多,指定 _source 里面会有哪些字段。定义好文档的 type 类型为 _doc,索引定义为 java_client。索引操作所需要的定义都已经包装到 IndexRequest 里面了,但是 IndexRequest 并不能发起请求,实际上它只是对请求索引操作的一个数据包装,真正 HTTP 请求 ES 的还是 client 对象。
IndexRequest indexRequest = new IndexRequest()
.id("1").source(builder);
indexRequest.type("_doc");
indexRequest.index("java_client");