4

我使用 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 对象并检索 key_id的值是一种方法,但是有没有可以获取文档 ID 的 API?

4

2 回答 2

10

仅供参考,正在寻找相同的内容,因此查看了 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)
于 2016-02-20T00:43:29.463 回答
6

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

正如@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,则该"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");
    }
}
于 2015-11-12T00:40:03.733 回答