Получить дубликаты документов на основе дублированного вложенного типа - PullRequest
0 голосов
/ 26 апреля 2019

Добрый день, ребята.У меня есть тип документа «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.

Как получить 5 (значение размера) документов в searchResponseзаказать по полной программе?

О, да.Версия ElasticSearch - 1.4.5

1 Ответ

0 голосов
/ 26 апреля 2019

Поскольку в индексе хранится только два документа (или, по крайней мере, два документа соответствуют вашему запросу), эти два документа будут возвращены вам в течение SearchResponse. Вы не можете напрямую получить первые пять вложенных документов, отсортированных по completeTime, так как ответ на поиск содержит целые объекты, которые хранятся в индексе.

Решением для вас будет разобрать результаты в коде Java:

  • Поскольку вы установили размер запроса равным 5, вы получите максимум пять результатов, отсортированных сначала по наибольшему completeTime. Это означает, что вы получите все необходимые данные, а затем еще
  • Разобрать все вложенные документы в java, затем отсортировать их снова и взять первые пять из них
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...