|
50 | 50 | import org.elasticsearch.indices.SystemIndexDescriptor; |
51 | 51 | import org.elasticsearch.rest.RestStatus; |
52 | 52 | import org.elasticsearch.search.aggregations.BucketOrder; |
| 53 | +import org.elasticsearch.search.aggregations.bucket.filter.Filters; |
| 54 | +import org.elasticsearch.search.aggregations.bucket.filter.FiltersAggregationBuilder; |
| 55 | +import org.elasticsearch.search.aggregations.bucket.filter.FiltersAggregator; |
53 | 56 | import org.elasticsearch.search.aggregations.bucket.terms.Terms; |
54 | 57 | import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; |
55 | 58 | import org.elasticsearch.search.builder.SearchSourceBuilder; |
@@ -94,6 +97,8 @@ public class SynonymsManagementAPIService { |
94 | 97 | private static final int MAX_SYNONYMS_SETS = 10_000; |
95 | 98 | private static final String SYNONYM_RULE_ID_FIELD = SynonymRule.ID_FIELD.getPreferredName(); |
96 | 99 | private static final String SYNONYM_SETS_AGG_NAME = "synonym_sets_aggr"; |
| 100 | + private static final String RULE_COUNT_AGG_NAME = "rule_count"; |
| 101 | + private static final String RULE_COUNT_FILTER_KEY = "synonym_rules"; |
97 | 102 | private static final int SYNONYMS_INDEX_MAPPINGS_VERSION = 1; |
98 | 103 | public static final int INDEX_SEARCHABLE_TIMEOUT_SECONDS = 30; |
99 | 104 | private final int maxSynonymsSets; |
@@ -185,27 +190,45 @@ private static XContentBuilder mappings() { |
185 | 190 | } |
186 | 191 | } |
187 | 192 |
|
| 193 | + /** |
| 194 | + * Returns all synonym sets with their rule counts, including empty synonym sets. |
| 195 | + * @param from The index of the first synonym set to return |
| 196 | + * @param size The number of synonym sets to return |
| 197 | + * @param listener The listener to return the synonym sets to |
| 198 | + */ |
188 | 199 | public void getSynonymsSets(int from, int size, ActionListener<PagedResult<SynonymSetSummary>> listener) { |
| 200 | + BoolQueryBuilder synonymSetQuery = QueryBuilders.boolQuery() |
| 201 | + .should(QueryBuilders.termQuery(OBJECT_TYPE_FIELD, SYNONYM_SET_OBJECT_TYPE)) |
| 202 | + .should(QueryBuilders.termQuery(OBJECT_TYPE_FIELD, SYNONYM_RULE_OBJECT_TYPE)) |
| 203 | + .minimumShouldMatch(1); |
| 204 | + |
| 205 | + // Aggregation query to count only synonym rules (excluding synonym set objects) |
| 206 | + FiltersAggregationBuilder ruleCountAggregation = new FiltersAggregationBuilder( |
| 207 | + RULE_COUNT_AGG_NAME, |
| 208 | + new FiltersAggregator.KeyedFilter(RULE_COUNT_FILTER_KEY, QueryBuilders.termQuery(OBJECT_TYPE_FIELD, SYNONYM_RULE_OBJECT_TYPE)) |
| 209 | + ); |
| 210 | + |
189 | 211 | client.prepareSearch(SYNONYMS_ALIAS_NAME) |
190 | 212 | .setSize(0) |
191 | 213 | // Retrieves aggregated synonym rules for each synonym set, excluding the synonym set object type |
192 | | - .setQuery(QueryBuilders.termQuery(OBJECT_TYPE_FIELD, SYNONYM_RULE_OBJECT_TYPE)) |
| 214 | + .setQuery(synonymSetQuery) |
193 | 215 | .addAggregation( |
194 | 216 | new TermsAggregationBuilder(SYNONYM_SETS_AGG_NAME).field(SYNONYMS_SET_FIELD) |
195 | 217 | .order(BucketOrder.key(true)) |
196 | 218 | .size(maxSynonymsSets) |
| 219 | + .subAggregation(ruleCountAggregation) |
197 | 220 | ) |
198 | 221 | .setPreference(Preference.LOCAL.type()) |
199 | 222 | .execute(new ActionListener<>() { |
200 | 223 | @Override |
201 | 224 | public void onResponse(SearchResponse searchResponse) { |
202 | 225 | Terms termsAggregation = searchResponse.getAggregations().get(SYNONYM_SETS_AGG_NAME); |
203 | 226 | List<? extends Terms.Bucket> buckets = termsAggregation.getBuckets(); |
204 | | - SynonymSetSummary[] synonymSetSummaries = buckets.stream() |
205 | | - .skip(from) |
206 | | - .limit(size) |
207 | | - .map(bucket -> new SynonymSetSummary(bucket.getDocCount(), bucket.getKeyAsString())) |
208 | | - .toArray(SynonymSetSummary[]::new); |
| 227 | + SynonymSetSummary[] synonymSetSummaries = buckets.stream().skip(from).limit(size).map(bucket -> { |
| 228 | + Filters ruleCountFilters = bucket.getAggregations().get(RULE_COUNT_AGG_NAME); |
| 229 | + Filters.Bucket ruleCountBucket = ruleCountFilters.getBucketByKey(RULE_COUNT_FILTER_KEY); |
| 230 | + return new SynonymSetSummary(ruleCountBucket.getDocCount(), bucket.getKeyAsString()); |
| 231 | + }).toArray(SynonymSetSummary[]::new); |
209 | 232 |
|
210 | 233 | listener.onResponse(new PagedResult<>(buckets.size(), synonymSetSummaries)); |
211 | 234 | } |
|
0 commit comments