|
45 | 45 | import org.apache.lucene.search.BooleanClause;
|
46 | 46 | import org.apache.lucene.search.BooleanQuery;
|
47 | 47 | import org.apache.lucene.search.BoostQuery;
|
| 48 | +import org.apache.lucene.search.IndexSearcher; |
48 | 49 | import org.apache.lucene.search.PhraseQuery;
|
49 | 50 | import org.apache.lucene.search.Query;
|
50 | 51 | import org.apache.lucene.search.TermQuery;
|
@@ -137,10 +138,7 @@ private Optional<BooleanQuery> buildIdsQuery(
|
137 | 138 | io.gravitee.rest.api.service.search.query.Query<?> query
|
138 | 139 | ) {
|
139 | 140 | if (!isBlank(query.getQuery()) && query.getIds() != null && !query.getIds().isEmpty()) {
|
140 |
| - increaseMaxClauseCountIfNecessary(query.getIds().size()); |
141 |
| - |
142 | 141 | BooleanQuery.Builder mainQuery = new BooleanQuery.Builder();
|
143 |
| - |
144 | 142 | query
|
145 | 143 | .getIds()
|
146 | 144 | .forEach(id -> {
|
@@ -198,22 +196,45 @@ private Optional<BooleanQuery> buildWildcardQuery(
|
198 | 196 | @Override
|
199 | 197 | public SearchResult search(ExecutionContext executionContext, io.gravitee.rest.api.service.search.query.Query<?> query)
|
200 | 198 | throws TechnicalException {
|
| 199 | + BooleanQuery.Builder apiQuery = new BooleanQuery.Builder(); |
| 200 | + |
201 | 201 | try {
|
202 | 202 | final Optional<Query> baseFilterQuery = this.buildFilterQuery(FIELD_ID, query.getFilters());
|
203 |
| - |
204 |
| - BooleanQuery.Builder apiQuery = new BooleanQuery.Builder(); |
205 | 203 | this.buildExcludedFilters(query.getExcludedFilters()).ifPresent(q -> apiQuery.add(q, BooleanClause.Occur.MUST_NOT));
|
206 | 204 | this.buildExplicitQuery(executionContext, query, baseFilterQuery).ifPresent(q -> apiQuery.add(q, BooleanClause.Occur.MUST));
|
207 | 205 | this.buildExactMatchQuery(executionContext, query, baseFilterQuery)
|
208 | 206 | .ifPresent(q -> apiQuery.add(new BoostQuery(q, 4.0f), BooleanClause.Occur.SHOULD));
|
209 | 207 | this.buildWildcardQuery(executionContext, query, baseFilterQuery).ifPresent(q -> apiQuery.add(q, BooleanClause.Occur.SHOULD));
|
210 | 208 | this.buildIdsQuery(executionContext, query).ifPresent(q -> apiQuery.add(q, BooleanClause.Occur.SHOULD));
|
211 |
| - |
212 |
| - return this.search(apiQuery.build(), query.getSort()); |
213 | 209 | } catch (ParseException pe) {
|
214 | 210 | logger.error("Invalid query to search for API documents", pe);
|
215 | 211 | throw new TechnicalException("Invalid query to search for API documents", pe);
|
216 | 212 | }
|
| 213 | + |
| 214 | + BooleanQuery finalQuery = apiQuery.build(); |
| 215 | + |
| 216 | + try { |
| 217 | + return this.search(finalQuery, query.getSort()); |
| 218 | + } catch (IndexSearcher.TooManyClauses tooManyClauses) { |
| 219 | + int maxClauseCount = getClauseCount(finalQuery); |
| 220 | + increaseMaxClauseCountIfNecessary(maxClauseCount); |
| 221 | + return this.search(finalQuery, query.getSort()); |
| 222 | + } |
| 223 | + } |
| 224 | + |
| 225 | + private int getClauseCount(Query query) { |
| 226 | + int result = 0; |
| 227 | + if (query instanceof BooleanQuery) { |
| 228 | + List<BooleanClause> clauses = ((BooleanQuery) query).clauses(); |
| 229 | + result = clauses.size(); |
| 230 | + for (BooleanClause clause : clauses) { |
| 231 | + result += getClauseCount(clause.getQuery()); |
| 232 | + } |
| 233 | + } else if (query instanceof BoostQuery) { |
| 234 | + result += getClauseCount(((BoostQuery) query).getQuery()); |
| 235 | + } |
| 236 | + |
| 237 | + return result; |
217 | 238 | }
|
218 | 239 |
|
219 | 240 | private Optional<BooleanQuery> buildExcludedFilters(Map<String, Collection<String>> excludedFilters) {
|
|
0 commit comments