一、 基本步骤:
1.创建连接对象:
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http")
)
);
2.创建请求对象:
GetRequest getRequest = new GetRequest("posts", "doc", "16");
3.为请求对象设置参数:
(1)设置查询的版本:
getRequest.version(2) 可以不设置,如果设置所要查询的文档版本号为2,如果当前版本号为4,则查询失败,报错如下
{
"error":{
"root_cause":[
{
"type":"version_conflict_engine_exception",
"reason":"[doc][16]: version conflict, current version [4] is different than the one provided [2]",
"index_uuid":"60e-U9cXSYqFGC34_gTrug",
"shard":"3",
"index":"posts"
}
],
"type":"version_conflict_engine_exception",
"reason":"[doc][16]: version conflict, current version [4] is different than the one provided [2]",
"index_uuid":"60e-U9cXSYqFGC34_gTrug",
"shard":"3",
"index":"posts"
},
"status":409
}
(2)设置查询的参数
a. 查询文档中指定的字段(如message和以Date结尾的字段): String[] includes = new String[]{"message", "*Date"}
查询文档中所有的字段:String[] includes = Strings.EMPTY_ARRAY;
b. 过滤掉文档中指定的字段(如message): String[] excludes = new String[]{"message"};
不过滤文档中任何字段:String[] excludes = Strings.EMPTY_ARRAY;
c. FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
其中includes可以传null,此时表示查询所有的字段
excludes也可以为null,此时表示不过滤掉任何字段
注: 如果includes和excludes包含同一个字段,则excludes起作用,也就是查询的字段会被过滤掉
d. 将设置的查询参数赋值给请求对象:
getRequest.fetchSourceContext(fetchSourceContext);
e.如果不希望返回结果中包含内容,可以进行如下设置:
getRequest.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);
默认是返回全部内容的
二、进行同步查询:
1,执行方法:
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
2,根据返回的结果:
a.判断文档是否存在:
getResponse.isExists(),如果为true,则存在
b.将查询的文档内容转成字符串:
String sourceAsString = getResponse.getSourceAsString();
c.将查询的文档内容转换成Map对象:
Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
3,同步方法查询的完整代码示例:
package com.example.elasticsearch.main;
import org.apache.http.HttpHost;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.Strings;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import java.io.IOException;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
*
* @Author: Weichang Zhong
* @Date: 2018/11/7
* @Time: 9:15
* @Description:
*/
public class GetRequestMain {
public static void main(String[] args) throws Exception{
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http")
)
);
GetRequest getRequest = new GetRequest("posts", "doc", "16");
getRequest.version(4);
String[] includes = new String[]{"message", "*Date"};
String[] excludes = Strings.EMPTY_ARRAY;
FetchSourceContext fetchSourceContext =
new FetchSourceContext(true, includes, excludes);
getRequest.fetchSourceContext(fetchSourceContext);
try {
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
String index = getResponse.getIndex();
String type = getResponse.getType();
String id = getResponse.getId();
System.out.println("index:" + index + "; type:" + type + "; id:" + id);
if (getResponse.isExists()) {
long version = getResponse.getVersion();
String sourceAsString = getResponse.getSourceAsString();
System.out.println("version:" + version + ",内容字符串:" + sourceAsString);
Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
byte[] sourceAsBytes = getResponse.getSourceAsBytes();
} else {
System.out.println("所查询的文档不存在!");
}
} catch (ElasticsearchException e) {
if (e.status() == RestStatus.NOT_FOUND) {
System.out.println("所查询的文档库不存在!");
}else if(e.status() == RestStatus.CONFLICT) {
System.out.println("与当前版本冲突");
}
}
}
}
注意:无论文档类型或id不存在,只要文档库存在,getResponse都会得到返回的结果
而要是文档库不存在:GetRequest request = new GetRequest("does_not_exist", "doc", "1"); 或版本冲突,则查询结果会报异常,并以ElasticsearchException接收异常
评论区