求助:Elasticsearch6.3.1 Java8低级别REST客户端match_all查询编写
实现Elasticsearch 6.3.1 match_all查询的Java正确代码
看起来你已经把查询结构搭好了,但漏掉了最关键的两步——发送请求到ES集群和解析返回的响应数据,所以才只能看到请求的JSON结构,拿不到索引里的实际内容。下面针对你用的两种方式分别给出完整的正确实现:
一、使用RestHighLevelClient(推荐,对应你写的SearchRequest代码)
Elasticsearch 6.x的RestHighLevelClient是官方推荐的Java客户端,你的代码已经完成了请求构建,只需要补充发送请求和解析响应的逻辑:
首先确保导入必要的依赖包:
import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException;
完整的查询代码:
// 先初始化RestHighLevelClient(根据你的集群配置调整节点地址) RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"))); try { // 构建查询请求,指定要查询的索引try1 SearchRequest searchRequest = new SearchRequest("try1"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // 设置match_all查询 searchSourceBuilder.query(QueryBuilders.matchAllQuery()); // 可选:调整返回结果数量,默认是10条,如果需要更多可以设置size // searchSourceBuilder.size(50); searchRequest.source(searchSourceBuilder); // 发送请求并获取响应 SearchResponse searchResponse = client.search(searchRequest); // 解析响应,遍历所有命中的文档 searchResponse.getHits().forEach(hit -> { // 打印文档的原始JSON内容 System.out.println("文档内容:" + hit.getSourceAsString()); // 如果需要提取特定字段,可以用getSourceAsMap() // Map<String, Object> sourceMap = hit.getSourceAsMap(); // String targetField = (String) sourceMap.get("your_field_name"); }); } catch (IOException e) { e.printStackTrace(); } finally { // 最后记得关闭客户端 try { client.close(); } catch (IOException e) { e.printStackTrace(); } }
二、使用SearchRequestBuilder(对应你写的第一种代码)
你之前的代码有两个问题:没有指定要查询的索引,也没有执行请求。补充后完整代码如下(适用于TransportClient):
import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.transport.client.PreBuiltTransportClient; import java.net.InetAddress; import java.net.UnknownHostException; // 初始化TransportClient TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300)); try { // 构建查询,记得指定索引try1 SearchRequestBuilder sr = new SearchRequestBuilder(client, SearchAction.INSTANCE) .setIndices("try1") // 你之前漏掉了这一步! .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery(QueryBuilders.matchAllQuery()); // 执行请求并获取响应 SearchResponse response = sr.execute().actionGet(); // 解析响应 response.getHits().forEach(hit -> { System.out.println("文档内容:" + hit.getSourceAsString()); }); } catch (UnknownHostException e) { e.printStackTrace(); } finally { client.close(); }
关键注意点
- 不管用哪种方式,都必须调用执行方法(
client.search()或execute().actionGet())才能真正发送请求到ES - 一定要指定要查询的索引(
SearchRequest构造时传入,或者SearchRequestBuilder.setIndices()),否则ES不知道要查哪个索引 - 解析响应时要从
SearchResponse.getHits()里获取实际的文档数据,而不是打印请求对象
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

