ElasticSearch GetApi
Posted 沟渠映明月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch GetApi相关的知识,希望对你有一定的参考价值。
直接使用文档中的GET请求是可以获取数据的,但在客户都里要指定查询的字段incloudes,否则查询出的数据是空
/** * @author wjc * @description * @date 2020/5/9 */ @Component public class GetApi { @Autowired private RestHighLevelClient highLevelClient; @Autowired @Qualifier("getListener") private ActionListener listener; public String get(String index, String id){ String message = null; GetRequest request = new GetRequest(index, id); // GetRequest request = new GetRequest(index, id); //禁用源检索,默认启用 request.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE); //为特定字段配置源包含 String[] includes = new String[]{"user", "message", "*Date"}; //为特定字段配置源排除 String[] excludes = Strings.EMPTY_ARRAY; // String[] excludes = new String[]{"message"}; FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes); request.fetchSourceContext(fetchSourceContext); // request.routing("routing"); // request.preference("preference"); // // //为特定的存储字段配置检索(要求字段在映射中单独存储) // request.storedFields("message"); // //将realtime标记设置为false(默认为true) // request.realtime(false); // //在检索文档之前执行刷新(默认为false) // request.refresh(true); // request.version(2); // request.versionType(VersionType.EXTERNAL); try { GetResponse getResponse = highLevelClient.get(request, RequestOptions.DEFAULT); highLevelClient.getAsync(request, RequestOptions.DEFAULT, listener); //检索消息存储字段(要求字段在映射中单独存储) // message = getResponse.getField("message").getValue(); message = getResponse.getSourceAsString(); }catch (IOException e){ }//当对不存在的索引执行get请求时,响应有404状态代码,抛出ElasticsearchException,需要按如下方式处理 catch (ElasticsearchException e) { if (e.status() == RestStatus.NOT_FOUND) { //处理因索引不存在而引发的异常 } //如果已请求特定的文档版本,而现有文档具有不同的版本号,则会引发版本冲突 if (e.status() == RestStatus.CONFLICT) { } } return message; } }
Listener
@Slf4j @Configuration public class ESGetListener { @Bean("getListener") public ActionListener listener(){ ActionListener<GetResponse> listener = new ActionListener<GetResponse>() { //在执行成功完成时调用。 @Override public void onResponse(GetResponse getResponse) { String index = getResponse.getIndex(); String type = getResponse.getType(); String id = getResponse.getId(); if (getResponse.isExists()) { long version = getResponse.getVersion(); //以字符串的形式检索文档 String sourceAsString = getResponse.getSourceAsString(); //以Map<String, Object>的形式检索文档 Map<String, Object> sourceAsMap = getResponse.getSourceAsMap(); //以字节[]的形式检索文档 byte[] sourceAsBytes = getResponse.getSourceAsBytes(); log.info("jsonString: " + sourceAsString); log.info("map: " + JSON.toJSONString(sourceAsMap)); log.info("byte[]: " + new String(sourceAsBytes)); } else { //处理没有找到文档的场景。注意,虽然返回的响应有404状态代码,但是返回的是有效的GetResponse, // 而不是抛出异常。这种响应不包含任何源文档,其isExists方法返回false。 } } //当整个GetRequest失败时调用。 @Override public void onFailure(Exception e) { } }; return listener; } }
Service
@Service public class ElasticSearchService { @Autowired private GetApi getApi; public String get(String index, String id){ if(StringUtils.isBlank(index) || StringUtils.isBlank(id)){ return ""; } return getApi.get(index, id); } }
Controller
@RestController public class ElasticSearchController { @Autowired private ElasticSearchService elasticSearchService; @PostMapping("/es/get/get") public String get(String index, String id){ return elasticSearchService.get(index, id); } }
请求示例
以上是关于ElasticSearch GetApi的主要内容,如果未能解决你的问题,请参考以下文章
elasticsearch代码片段,及工具类SearchEsUtil.java
ElasticSearch学习问题记录——Invalid shift value in prefixCoded bytes (is encoded value really an INT?)(代码片段