ElastiSearch DateHistogram и агрегация TopHits - PullRequest
0 голосов
/ 04 ноября 2018

Я просканировал кучу статей и хочу найти самую актуальную статью каждый день. Значение -> Я ищу, например. «Яблоко», а затем хотите 5 статей (по одной в день), принимая самые актуальные в день.

Java-код

public List<ArticleEntity> findByKeyword(String keyword, String dateFrom, String dateTo) {
        TransportClient client = elasticSearchProvider.getClient();
        SearchRequestBuilder requestBuilder = client.prepareSearch("summarizer").setTypes("article").setSearchType(SearchType.QUERY_THEN_FETCH);

        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        boolQueryBuilder.filter(
                QueryBuilders.queryStringQuery(keyword + "*").analyzeWildcard(true)
        );

        DateHistogramAggregationBuilder dateHistogramAggregationBuilder =
                AggregationBuilders.dateHistogram("date").field("publish_date").format("yyyy-MM-dd").dateHistogramInterval(DateHistogramInterval.DAY).subAggregation(
                        AggregationBuilders.topHits("top").size(1).explain(true)

                ).keyed(true);

        requestBuilder.setQuery(boolQueryBuilder)
                .addAggregation(dateHistogramAggregationBuilder);

        SearchResponse response = requestBuilder.execute().actionGet();

        List<ArticleEntity> articleEntityList = new ArrayList<>();

        ObjectMapper oMapper = new ObjectMapper();
        oMapper.setPropertyNamingStrategy(
                PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

        Histogram dateHits = response.getAggregations().get("date");
        for (Histogram.Bucket entry : dateHits.getBuckets()) {
            TopHits topHits = entry.getAggregations().get("top");
            for (SearchHit hit : topHits.getHits().getHits()) {
                Map<String, Object> source = hit.getSource();
                if (source != null) {
                    articleEntityList.add(oMapper.convertValue(source, ArticleEntity.class));
                }
            }

        }

        return articleEntityList;

    }

Проблема здесь в том, что размер корзины превышает 2000 -> в то время как для меня размер корзины должен быть где-то около 6-7 (я сканировал статьи за последние 6 дней).

Одна часть документа ES:

article_authors: "Dorothy Pitti",
facebook_score: 0,
keywords: "users,apps,nsfw,app,privacy,exchanges,best,screenshot,dont,sexting,messages,youre,good,features",
publish_date: "2018-09-14",

Итак, почему у меня неправильный размер ковша? Я уже пробовал разные форматы даты (включая время), но ничего не работает. Есть идеи?

...