private static void checkForTooManyFields(Map<String, Float> fields, QueryShardContext context) { Integer limit = SearchModule.INDICES_MAX_CLAUSE_COUNT_SETTING.get(context.getIndexSettings().getSettings()); if (fields.size() > limit) { DEPRECATION_LOGGER.deprecatedAndMaybeLog("field_expansion_limit", "Field expansion matches too many fields, got: {}. This will be limited starting with version 7.0 of Elasticsearch. " + "The limit will be detemined by the `indices.query.bool.max_clause_count` setting which is currently set to {}. " + "You should look at lowering the maximum number of fields targeted by a query or increase the above limit " + "while being aware that this can negatively affect your clusters performance.", fields.size(), limit); } } }
@Override protected Query getRegexpQuery(String field, String termStr) throws ParseException { final int maxAllowedRegexLength = context.getIndexSettings().getMaxRegexLength(); if (termStr.length() > maxAllowedRegexLength) { throw new IllegalArgumentException( "The length of regex [" + termStr.length() + "] used in the [query_string] has exceeded " + "the allowed maximum of [" + maxAllowedRegexLength + "]. This maximum can be set by changing the [" + IndexSettings.MAX_REGEX_LENGTH_SETTING.getKey() + "] index level setting."); } Map<String, Float> fields = extractMultiFields(field, false); if (fields.isEmpty()) { return newUnmappedFieldQuery(termStr); } List<Query> queries = new ArrayList<>(); for (Map.Entry<String, Float> entry : fields.entrySet()) { Query q = getRegexpQuerySingle(entry.getKey(), termStr); assert q != null; queries.add(applyBoost(q, entry.getValue())); } if (queries.size() == 1) { return queries.get(0); } else { float tiebreaker = groupTieBreaker == null ? type.tieBreaker() : groupTieBreaker; return new DisjunctionMaxQuery(queries, tiebreaker); } }
@Override protected Query doToQuery(QueryShardContext context) throws QueryShardException, IOException { final int maxAllowedRegexLength = context.getIndexSettings().getMaxRegexLength(); if (value.length() > maxAllowedRegexLength) { throw new IllegalArgumentException( "The length of regex [" + value.length() + "] used in the Regexp Query request has exceeded " + "the allowed maximum of [" + maxAllowedRegexLength + "]. " + "This maximum can be set by changing the [" + IndexSettings.MAX_REGEX_LENGTH_SETTING.getKey() + "] index level setting."); } MultiTermQuery.RewriteMethod method = QueryParsers.parseRewriteMethod(rewrite, null, LoggingDeprecationHandler.INSTANCE); Query query = null; MappedFieldType fieldType = context.fieldMapper(fieldName); if (fieldType != null) { query = fieldType.regexpQuery(value, flagsValue, maxDeterminizedStates, method, context); } if (query == null) { RegexpQuery regexpQuery = new RegexpQuery(new Term(fieldName, BytesRefs.toBytesRef(value)), flagsValue, maxDeterminizedStates); if (method != null) { regexpQuery.setRewriteMethod(method); } query = regexpQuery; } return query; }
@Override protected Query doToQuery(QueryShardContext context) throws IOException { if (termsLookup != null || supplier != null) { throw new UnsupportedOperationException("query must be rewritten first"); } if (values == null || values.isEmpty()) { return Queries.newMatchNoDocsQuery("No terms supplied for \"" + getName() + "\" query."); } int maxTermsCount = context.getIndexSettings().getMaxTermsCount(); if (values.size() > maxTermsCount){ DEPRECATION_LOGGER.deprecated( "Deprecated: the number of terms [" + values.size() + "] used in the Terms Query request has exceeded " + "the allowed maximum of [" + maxTermsCount + "]. " + "This maximum can be set by changing the [" + IndexSettings.MAX_TERMS_COUNT_SETTING.getKey() + "] index level setting."); } MappedFieldType fieldType = context.fieldMapper(fieldName); if (fieldType != null) { return fieldType.termsQuery(values, context); } else { BytesRef[] filterValues = new BytesRef[values.size()]; for (int i = 0; i < filterValues.length; i++) { filterValues[i] = BytesRefs.toBytesRef(values.get(i)); } return new TermInSetQuery(fieldName, filterValues); } }
@Override protected ValuesSourceAggregatorFactory<Numeric, ?> innerBuild(SearchContext context, ValuesSourceConfig<Numeric> config, AggregatorFactory<?> parent, Builder subFactoriesBuilder) throws IOException { RoundingInfo[] roundings = buildRoundings(timeZone()); int maxRoundingInterval = Arrays.stream(roundings,0, roundings.length-1) .map(rounding -> rounding.innerIntervals) .flatMapToInt(Arrays::stream) .boxed() .reduce(Integer::max).get(); Settings settings = context.getQueryShardContext().getIndexSettings().getNodeSettings(); int maxBuckets = MultiBucketConsumerService.MAX_BUCKET_SETTING.get(settings); if (maxBuckets >= 0) { int bucketCeiling = maxBuckets / maxRoundingInterval; if (numBuckets > bucketCeiling) { throw new IllegalArgumentException(NUM_BUCKETS_FIELD.getPreferredName() + " must be less than " + bucketCeiling); } } else if ( numBuckets > (MultiBucketConsumerService.SOFT_LIMIT_MAX_BUCKETS / maxRoundingInterval)) { DEPRECATION_LOGGER.deprecated("This request will fail in 7.x, because number of buckets, " + numBuckets+", is greater than default max buckets ("+MultiBucketConsumerService.SOFT_LIMIT_MAX_BUCKETS+ ") divided by the max rounding interval ("+maxRoundingInterval+")." ); } return new AutoDateHistogramAggregatorFactory(name, config, numBuckets, roundings, context, parent, subFactoriesBuilder, metaData); }
@Override public Query termsQuery(List<?> values, QueryShardContext context) { if (context.getIndexSettings().isSingleType()) { Collection<String> indexTypes = context.getMapperService().types(); if (indexTypes.isEmpty()) {
String fieldName = fieldType != null ? fieldType.name() : prefixBuilder.fieldName(); if (context.getIndexSettings().getIndexVersionCreated().before(Version.V_6_4_0)) {
@Override public Query rangeQuery(Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, QueryShardContext context) { if (context.getIndexSettings().isSingleType() == false) { return new TermRangeQuery(name(), lowerTerm == null ? null : indexedValueForSearch(lowerTerm), upperTerm == null ? null : indexedValueForSearch(upperTerm), includeLower, includeUpper);
int numShards = context.getIndexSettings().getNumberOfShards(); if (minNodeVersion.onOrAfter(Version.V_6_4_0) && (request.preference() != null || request.indexRoutings().length > 0)) { boolean useTermQuery = false; if (UidFieldMapper.NAME.equals(field)) { if (context.getIndexSettings().isSingleType()) { if (context.getIndexSettings().isSingleType() == false) {
DEPRECATION_LOGGER.deprecated( "As of version 7.0 Elasticsearch will require that a [field] parameter is provided when a [seed] is set"); if (context.getIndexSettings().isSingleType()) { fieldType = context.getMapperService().fullName(IdFieldMapper.NAME); } else {
String originalName = nestedObjectMapper.name(); SearchHit.NestedIdentity nestedIdentity = null; final IndexSettings indexSettings = context.getQueryShardContext().getIndexSettings(); do { Query parentFilter;
@Override protected Query doToQuery(QueryShardContext context) throws IOException { if (context.getIndexSettings().isSingleType()) { return joinFieldDoToQuery(context); } else { return parentFieldDoToQuery(context); } }
@Override protected Query doToQuery(QueryShardContext context) throws IOException { if (context.getIndexSettings().isSingleType()) { return joinFieldDoToQuery(context); } else { return parentFieldDoToQuery(context); } }
@Override protected Query doToQuery(QueryShardContext context) throws IOException { if (context.getIndexSettings().isSingleType()) { return joinFieldDoToQuery(context); } else { return parentFieldDoToQuery(context); } }
@Override protected Query doToQuery(QueryShardContext context) throws IOException { if (context.getIndexSettings().isSingleType()) { return joinFieldDoToQuery(context); } else { return parentFieldDoToQuery(context); } }
@Override protected Query doToQuery(QueryShardContext context) throws IOException { if (context.getIndexSettings().isSingleType()) { return joinFieldDoToQuery(context); } else { return parentFieldDoToQuery(context); } }
@Override protected Query doToQuery(QueryShardContext context) throws IOException { if (context.getIndexSettings().isSingleType()) { return joinFieldDoToQuery(context); } else { return parentFieldDoToQuery(context); } }
@Override @SuppressWarnings("unchecked") public <IFD extends IndexFieldData<?>> IFD getForField(MappedFieldType fieldType) { IndexFieldData.Builder builder = fieldType.fielddataBuilder(shardContext.getFullyQualifiedIndex().getName()); IndexFieldDataCache cache = new IndexFieldDataCache.None(); CircuitBreakerService circuitBreaker = new NoneCircuitBreakerService(); return (IFD) builder.build(shardContext.getIndexSettings(), fieldType, cache, circuitBreaker, shardContext.getMapperService()); } };
@Override @SuppressWarnings("unchecked") public <IFD extends IndexFieldData<?>> IFD getForField(MappedFieldType fieldType) { IndexFieldData.Builder builder = fieldType.fielddataBuilder(shardContext.getFullyQualifiedIndex().getName()); IndexFieldDataCache cache = new IndexFieldDataCache.None(); CircuitBreakerService circuitBreaker = new NoneCircuitBreakerService(); return (IFD) builder.build(shardContext.getIndexSettings(), fieldType, cache, circuitBreaker, shardContext.getMapperService()); } };
@Override protected ScoreFunction doToFunction(QueryShardContext context) { final MappedFieldType fieldType; if (context.getIndexSettings().isSingleType()) { fieldType = context.getMapperService().fullName(IdFieldMapper.NAME); } else { fieldType = context.getMapperService().fullName(UidFieldMapper.NAME); } if (fieldType == null) { // mapper could be null if we are on a shard with no docs yet, so this won't actually be used return new RandomScoreFunction(); } final int salt = (context.index().getName().hashCode() << 10) | context.getShardId(); final IndexFieldData<?> uidFieldData = context.getForField(fieldType); return new RandomScoreFunction(this.seed == null ? hash(context.nowInMillis()) : seed, salt, uidFieldData); }