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)
我使用 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)