如何在Elasticsearch返回结果中显示_seq_no与_primary_term?
获取Elasticsearch的
_seq_no和_primary_term字段解决方案 这两个字段属于Elasticsearch的元数据,默认不会在查询结果中返回,必须显式开启对应参数才能获取,以下是不同场景的设置方法:
Kibana控制台查询
无论是批量搜索还是单文档查询,都需要添加seq_no_primary_term: true参数:
- 批量搜索示例:
GET /your_index/_search { "query": { "match_all": {} }, "seq_no_primary_term": true }
- 单文档查询示例:
GET /your_index/_doc/your_doc_id?seq_no_primary_term=true
设置后,返回结果的每条命中数据里会包含_seq_no和_primary_term字段。
Java应用查询
根据你使用的Java客户端版本,对应设置开启参数:
旧版RestHighLevelClient
- 批量搜索:
SearchRequest searchRequest = new SearchRequest("your_index"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchAllQuery()); searchRequest.source(sourceBuilder); // 开启返回seq_no和primary_term searchRequest.setSeqNoPrimaryTerm(true); SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); // 遍历结果获取字段 for (SearchHit hit : searchResponse.getHits().getHits()) { long seqNo = hit.getSeqNo(); long primaryTerm = hit.getPrimaryTerm(); }
- 单文档查询:
GetRequest getRequest = new GetRequest("your_index", "your_doc_id"); getRequest.setSeqNoPrimaryTerm(true); GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT); long seqNo = getResponse.getSeqNo(); long primaryTerm = getResponse.getPrimaryTerm();
新版Java API Client(Elasticsearch 7.17+)
- 批量搜索:
SearchResponse<ObjectNode> response = client.search( s -> s.index("your_index") .query(q -> q.matchAll(m -> m)) .seqNoPrimaryTerm(true), ObjectNode.class ); // 遍历结果获取字段 for (Hit<ObjectNode> hit : response.hits().hits()) { long seqNo = hit.seqNo(); long primaryTerm = hit.primaryTerm(); }
- 单文档查询:
GetResponse<ObjectNode> getResponse = client.get( g -> g.index("your_index").id("your_doc_id").seqNoPrimaryTerm(true), ObjectNode.class ); long seqNo = getResponse.seqNo(); long primaryTerm = getResponse.primaryTerm();
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

