ElasticSearch Jest 客户端,如何从命中中获取 return 文档 id?

ElasticSearch Jest client, how to return document id from hit?

我使用 Jest 作为 ElasticSearch 客户端来搜索文档:

JestClient client = ...;
Search search = ...;
SearchResult searchResult = client.execute(search);
List<Hit<T, Void>> hits = searchResult.getHits(klass);

每个 Hit 对象看起来像:

{"_index":"some_index","_type":"some_type","_id":"some_id","_score":2.609438,"_source":{"foo1":"bar1","foo2":"bar2"}}

虽然我只能找到hit.source方法,但似乎没有hit.id方法。

将其解析为JSON对象并检索键_id的值是一种方法,但是有没有API可以获取文档id?

似乎无法通过 Jest API 获取 _id,必须从 _source 对象获取 _id

正如@juliendangers所说,添加@JestId注解可以实现:

public class MyClass {
    @JestId private String documentId;
    private String foo;
}

并且必须明确设置文档 ID: myClass.setDocumentId("some_id");

每个 Hit 对象看起来像: {"_index":"some_index","_type":"some_type","_id":"some_id","_score":2.609438,"_source":{"foo":"bar","documentId":"some_id"}}

(如果未明确设置文档 ID,Hit 中将缺少 "documentId":"some_id" 对)

虽然根据我的测试,如果使用继承,必须显式设置父 class 的文档 ID:

public class ParentClass {
    @JestId private String documentId;
}

public class MyClass extends ParentClass {
    private String foo;
    public MyClass() {
        super.setDocumentId("some_id");
    }
}

仅供参考,正在寻找相同的东西,所以查看了 Jest 源代码,发现 Jest 确实使用“_id”填充了 hit.source.es_metadata_id(如果存在)(参见 io.searchbox.core.SearchResult,第 115 行)

所以可以做一些像下面这样的事情来替代注释:

List<Hit<Map,Void>> hits = client.execute(search).getHits(Map.class)
Hit hit = hits.get(0)
Map source = (Map)hit.source
String id = (String)source.get(JestResult.ES_METADATA_ID)