JAVA操作Elasticsearch
一、java客户端可以对Es进行的操作:
-
在现有的集群上执行标准的索引、获取、删除、搜索功能。
-
在运行的集群上执行管理任务。
二、操作步骤
- 创建索引库
- 创建一个java工程
- 添加jar包,添加maven
- 编写测试服方法实现创建索引库
- 创建一个Setting对象,相当于一个配置信息,主要配置集群名称。
- 创建一个客户端Client对象
- 使用client对象创建一个索引库
- 关闭对象
三、javaAPI学习
1.get
-
get API允许根据id从索引中获取一个JSON文档。
GetResponse response = client.prepareGet("twitter", "tweet", "1").get();
-
选项是在不同的线程上执行操作,或者在调用线程上执行操作(注意,API仍然是异步的)。默认情况下,operationthread设置为true,这意味着操作在不同的线程上执行。这里有一个设置为false的例子:
GetResponse response = client.prepareGet("twitter", "tweet", "1") .setOperationThreaded(false) .get();
2.delete
- delete API允许用户根据id从特定索引中删除类型化JSON文档。下面的示例从名为twitter的索引中删除JSON文档,该索引的类型为tweet, id值为1
DeleteResponse response = client.prepareDelete("twitter", "tweet", "1").get();
- delete API允许设置线程模型,当API的实际执行在同一节点上执行时(该API在分配在同一服务器上的一个分片上执行),将执行该操作。
选项是在不同的线程上执行操作,或者在调用线程上执行操作(注意,API仍然是异步的)。默认情况下,operationthread设置为true,这意味着操作在不同的线程上执行。这里有一个设置为false的
DeleteResponse response = client.prepareDelete("twitter", "tweet", "1")
.setOperationThreaded(false)
.get();
- delete by query API允许根据查询结果删除给定的一组文档:
BulkByScrollResponse response =
DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchQuery("gender", "male"))
.source("persons")
.get();
long deleted = response.getDeleted();
query | |
---|---|
index | |
execute the operation | |
number of deleted documents |
- 因为它可以是一个长时间运行的操作,如果你希望异步地做它,你可以调用execute而不是get,并提供一个监听器,如:
DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchQuery("gender", "male"))
.source("persons")
.execute(new ActionListener<BulkByScrollResponse>() {
@Override
public void onResponse(BulkByScrollResponse response) {
long deleted = response.getDeleted();
}
@Override
public void onFailure(Exception e) {
// Handle the exception
}
});
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QOeRHDIk-1603810304529)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20200722100946907.png)]
3.update
-
创建一个UpdateRequest并发送到客户端:
UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index("index"); updateRequest.type("type"); updateRequest.id("1"); updateRequest.doc(jsonBuilder() .startObject() .field("gender", "male") .endObject()); client.update(updateRequest).get();
-
//可以使用prepareUpdate()方法 通过脚本方式实现 client.prepareUpdate("ttl", "doc", "1") .setScript(new Script( "ctx._source.gender = \"male\"", ScriptService.ScriptType.INLINE, null, null)) .get(); client.prepareUpdate("ttl", "doc", "1") .setDoc(jsonBuilder() .startObject() .field("gender", "male") .endObject()) .get();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9U96LQjH-1603810304536)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20200722101318232.png)]
你的脚本。它也可以是本地存储的脚本名。在这种情况下,您需要使用ScriptService.ScriptType.FILE
将合并到现有文件中的文档。
注意,您不能同时提供脚本和文档。
-
//更新API允许根据提供的脚本更新文档: UpdateRequest updateRequest = new UpdateRequest("ttl", "doc", "1") .script(new Script("ctx._source.gender = \"male\"")); client.update(updateRequest).get();
-
update API还支持传递部分文档,将其合并到现有文档中(简单的递归合并、对象的内部合并、替换核心“键/值”和数组)。例如:
-
UpdateRequest updateRequest = new UpdateRequest("index", "type", "1") .doc(jsonBuilder() .startObject() .field("gender", "male") .endObject()); client.update(updateRequest).get();
-
-
还支持upsert。如果文档不存在,upsert元素的内容将用于索引新文档:
-
IndexRequest indexRequest = new IndexRequest("index", "type", "1") .source(jsonBuilder() .startObject() .field("name", "Joe Smith") .field("gender", "male") .endObject()); UpdateRequest updateRequest = new UpdateRequest("index", "type", "1") .doc(jsonBuilder() .startObject() .field("gender", "male") .endObject()) .upsert(indexRequest); //如果文档不存在,则会添加indexRequest中的文档 client.update(updateRequest).get();
-
4. multiGet
multi get API允许根据文档的索引、类型和id获取文档列表
MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
.add("twitter", "tweet", "1") //通过id
.add("twitter", "tweet", "2", "3", "4") //或者相同索引/类型的id列表
.add("another", "type", "foo") //从另一个索引获取
.get();
for (MultiGetItemResponse itemResponse : multiGetItemResponses) { //遍历结果集
GetResponse response = itemResponse.getResponse();
if (response.isExists()) { //检测是否存在
String json = response.getSourceAsString(); // 获取_resource数据
}
}
5.Bulk delete
批量API允许在一个请求中索引和删除多个文档。下面是一个示例用法
import static org.elasticsearch.common.xcontent.XContentFactory.*;
BulkRequestBuilder bulkRequest = client.prepareBulk();
// either use client#prepare, or use Requests# to directly build index/delete requests
bulkRequest.add(client.prepareIndex("twitter", "tweet", "1")
.setSource(jsonBuilder()
.startObject()
.field("user", "kimchy")
.field("postDate", new Date())
.field("message", "trying out Elasticsearch")
.endObject()
)
);
bulkRequest.add(client.prepareIndex("twitter", "tweet", "2")
.setSource(jsonBuilder()
.startObject()
.field("user", "kimchy")
.field("postDate", new Date())
.field("message", "another post")
.endObject()
)
);
BulkResponse bulkResponse = bulkRequest.get();
if (bulkResponse.hasFailures()) {
// process failures by iterating through each bulk response item
}
6. search
搜索API允许执行搜索查询并返回与查询匹配的搜索结果。它可以跨一个或多个索引以及跨一个或多个类型执行。可以使用查询Java API提供查询。搜索请求的主体是使用SearchSourceBuilder构建的。
SearchResponse response = client.prepareSearch("index1", "index2")
.setTypes("type1", "type2")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.termQuery("multi", "test")) // Query
.setPostFilter(QueryBuilders.rangeQuery("age").from(12).to(18)) // Filter
.setFrom(0).setSize(60).setExplain(true)
.get();
注意,所有参数都是可选的。这是你能写的最小的搜索调用
SearchResponse response = client.prepareSearch().get();
尽管Java API定义了额外的搜索类型QUERY_AND_FETCH和DFS_QUERY_AND_FETCH,但是这些模式是内部优化,不应该由API的用户显式地指定。
- 全文查询
高级全文查询通常用于在全文字段(如电子邮件正文)上运行全文查询。它们理解被查询的字段是如何分析的,并在执行之前将每个字段的分析器(或search_analyzer)应用到查询字符串。
ava
SearchResponse response = client.prepareSearch().get();
尽管Java API定义了额外的搜索类型QUERY_AND_FETCH和DFS_QUERY_AND_FETCH,但是这些模式是内部优化,不应该由API的用户显式地指定。
- 全文查询
高级全文查询通常用于在全文字段(如电子邮件正文)上运行全文查询。它们理解被查询的字段是如何分析的,并在执行之前将每个字段的分析器(或search_analyzer)应用到查询字符串。