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