ElasticSearch Jest客户端,如何从命中返回文档ID?

cod*_*erz 2 elasticsearch jest

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

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

每个Hit对象看起来像:

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

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

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

D.M*_*ure 8

只是fyi,正在寻找相同的,所以看看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)
Run Code Online (Sandbox Code Playgroud)


cod*_*erz 5

似乎无法_id通过JestAPI 获取,必须_id_source对象获取.

正如@juliendangers所提到的,添加@JestId注释可以实现:

public class MyClass {
    @JestId private String documentId;
    private String foo;
}
Run Code Online (Sandbox Code Playgroud)

并且必须明确设置文档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,则该"documentId":"some_id"对将丢失Hit)

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

public class ParentClass {
    @JestId private String documentId;
}

public class MyClass extends ParentClass {
    private String foo;
    public MyClass() {
        super.setDocumentId("some_id");
    }
}
Run Code Online (Sandbox Code Playgroud)