gpt4 book ai didi

java - 根据重复嵌套类型获取重复文档

转载 作者:行者123 更新时间:2023-12-02 06:16:55 25 4
gpt4 key购买 nike

大家好。我有一个文档类型“generalTask​​”,其中包含一组名为“completeUser”的嵌套文档。

这是映射:

{
"generalTask": {
"properties": {
"id": {
"type": "long"
},
"completeUser": {
"type": "nested",
"properties": {
"completeTime": {
"type": "long"
},
"userId": {
"type": "long"
}
}
}
}
}
}

现在,我们有两个文档。

例如

{
"_source": {
"id": 1001,
"completeUser": [
{
"userId": 1,
"completeTime": 100
},
{
"userId": 1,
"completeTime": 300
},
{
"userId":1,
"completeTime": 500
}
]
}
}

{
"_source": {
"id": 1002,
"completeUser": [
{
"userId": 1,
"completeTime": 200
},
{
"userId": 1,
"completeTime": 400
},
{
"userId":1,
"completeTime": 600
}
]
}
}

我可以通过嵌套聚合获取 docCount(即 6),如下所示:

    BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(nestedQuery("completeUser", termQuery("completeUser.userId", 1)));
BoolQueryBuilder builder = getClient().prepareSearch(getIndexName()).setTypes(getIndexType()).setQuery(query)
.addAggregation(AggregationBuilders.nested("nested").path("completeUser")
.subAggregation(AggregationBuilders.count("count").field("completeUser.userId"))).setSize(0);
SearchResponse searchResponse = getSearchResponse(builder);
Nested nested = searchResponse.getAggregations().get("nested");
long docCount = nested.getDocCount(); // the docCount is 6

但 searchResponse 中仍然只有 2 个文档:

SearchRequestBuilder builder = getClient().prepareSearch(getIndexName()).setTypes(getIndexType())
.setSearchType(SearchType.QUERY_THEN_FETCH).setQuery(query).setFrom(0).setSize(5); // the size is 5
builder.addSort(SortBuilders.fieldSort("completeUser.completeTime")
.setNestedFilter(FilterBuilders.termFilter("completeUser.userId", 1))
.order(SortOrder.DESC));
SearchResponse searchResponse = getSearchResponse(builder);

但我想要的是基于completeTime的重复文档。

如何在completeTime之前获取searchResponse顺序中的5个(size的值)文档?

哦,是的。 ElasticSearch版本为1.4.5

最佳答案

由于索引中仅存储了两个文档(或者至少有两个文档与您的查询匹配),因此这两个文档将在 SearchResponse 中返回给您。您无法直接获取按 completeTime 排序的前五个嵌套文档,因为搜索响应包含存储在索引中的整个对象。

您的解决方案是用 java 代码解析结果:

  • 由于您将查询大小设置为 5,因此最多将返回 5 个结果,首先按最高的 completeTime 排序。这意味着您确实收到了所有需要的数据,然后还有更多
  • 用java解析所有嵌套文档,然后再次排序并取前五个

关于java - 根据重复嵌套类型获取重复文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55865212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com