我甚至不知道如何恰当地表达这个问题,所以这是我最好的回答。
这是我从一个名为"attributes"的嵌套字段中获取innerhits的结果。我有一个索引(过滤掉元数据后):
"inner_hits" : {
"attributes" : {
"hits" : {
"hits" : [
{
"_source" : {
"name" : "Title",
"value" : "title title"
}
},
{
"_source" : {
"name" : "Author",
"value" : "Test"
}
},
{
"_source" : {
"name" : "Timestamp",
"value" : "20.12.2022 11:06:03"
}
}
]
}
}
}
在其他查询中,我只是像这样返回整个文档,所以它是自动映射的。在这种情况下,属性只是自动映射到MyClass中的List<AttributeClass>
属性:
MyClass doc = null;
SearchResponse<MyClass> search = client
.search(
s -> s
.index(myIndex)
.query(some-query),
MyClass.class);
List<Hit<MyClass>> hits = search.hits().hits();
for(Hit<MyClass> hit: hits) {doc = hit.source();}
return doc;
然而,现在我试图用innerhits"过滤"东西,结构有点不同。我不知道如何将内部命中列表"映射"回原始类,现在它是hits.hits.source
之外的单独部分,再次具有自己的源。我用这个创建一个新的json是不是更好?结果应该是一个可读的json。
附加信息:我使用的是spring boot和ES 7.17.3
我对未来的自己和任何需要想法的人的解决方案。我认为我的做法不是最好的,我愿意接受任何更有效的想法:
由于我的项目中有一些特殊的结构,我不得不将其打包到Map中以跟踪键值对的内容。我将省去所有不相关的事情
//imagine there's a SearchResponse called search here...
List<Hit<ClassForWholeResult>> hits = search.hits().hits();
for(Hit<ClassForWholeResult> hit: hits) {
Pair<String, List<Hit<JsonData>>> firstPair = Pair
.of(firstPairKey, hit.innerHits().get(INNER_HIT_FIELD_NAME).hits().hits());
//I had to insert my pairs into a map, I'm omitting it
}
//looping into the pairs that got inserted, pretend there's a loop for the map here
for(Pair<String, List<Hit<JsonData>>> pair: entryValue) {
String pairKey = pair.getLeft();
List<Hit<JsonData>> pairValue = pair.getRight();
for(Hit<JsonData> innerhit: pairValue) {
//I'm storing my results in a list
storingList.add(innerhit.source().to(CORRESPONDING_CLASS.class));
}