/** * Returns all the fields that match the given pattern. If the pattern is prefixed with a type * then the fields will be returned with a type prefix. */ public Collection<String> simpleMatchToIndexNames(String pattern) { if (Regex.isSimpleMatchPattern(pattern) == false) { // no wildcards return Collections.singletonList(pattern); } return fieldTypes.simpleMatchToFullName(pattern); }
/** * Extracts all the required fields from the RestRequest 'h' parameter. In order to support * wildcards like 'bulk.*' this needs potentially parse all the configured headers and its aliases * and needs to ensure that everything is only added once to the returned headers, even if * 'h=bulk.*.bulk.*' is specified or some headers are contained twice due to matching aliases */ private static Set<String> expandHeadersFromRequest(Table table, RestRequest request) { Set<String> headers = new LinkedHashSet<>(table.getHeaders().size()); // check headers and aliases for (String header : Strings.splitStringByCommaToArray(request.param("h"))) { if (Regex.isSimpleMatchPattern(header)) { for (Table.Cell tableHeaderCell : table.getHeaders()) { String configuredHeader = tableHeaderCell.value.toString(); if (Regex.simpleMatch(header, configuredHeader)) { headers.add(configuredHeader); } else if (tableHeaderCell.attr.containsKey("alias")) { String[] aliases = Strings.splitStringByCommaToArray(tableHeaderCell.attr.get("alias")); for (String alias : aliases) { if (Regex.simpleMatch(header, alias)) { headers.add(configuredHeader); break; } } } } } else { headers.add(header); } } return headers; }
private Map<String, FieldMappingMetaData> findFieldMappingsByType( DocumentMapper documentMapper, GetFieldMappingsIndexRequest request) { MapBuilder<String, FieldMappingMetaData> fieldMappings = new MapBuilder<>(); final DocumentFieldMappers allFieldMappers = documentMapper.mappers(); for (String field : request.fields()) { if (Regex.isMatchAllPattern(field)) { for (FieldMapper fieldMapper : allFieldMappers) { addFieldMapper( fieldMapper.fieldType().name(), fieldMapper, fieldMappings, request.includeDefaults()); } } else if (Regex.isSimpleMatchPattern(field)) { // go through the field mappers 3 times, to make sure we give preference to the resolve // order: full name, index name, name. // also make sure we only store each mapper once. Collection<FieldMapper> remainingFieldMappers = newLinkedList(allFieldMappers); for (Iterator<FieldMapper> it = remainingFieldMappers.iterator(); it.hasNext(); ) { final FieldMapper fieldMapper = it.next(); if (Regex.simpleMatch(field, fieldMapper.fieldType().name())) { addFieldMapper( fieldMapper.fieldType().name(), fieldMapper, fieldMappings, request.includeDefaults()); it.remove(); } } for (Iterator<FieldMapper> it = remainingFieldMappers.iterator(); it.hasNext(); ) { final FieldMapper fieldMapper = it.next(); if (Regex.simpleMatch(field, fieldMapper.fieldType().name())) { addFieldMapper( fieldMapper.fieldType().name(), fieldMapper, fieldMappings, request.includeDefaults()); it.remove(); } } } else { // not a pattern FieldMapper fieldMapper = allFieldMappers.smartNameFieldMapper(field); if (fieldMapper != null) { addFieldMapper(field, fieldMapper, fieldMappings, request.includeDefaults()); } else if (request.probablySingleFieldRequest()) { fieldMappings.put(field, FieldMappingMetaData.NULL); } } } return fieldMappings.immutableMap(); }
@Override public void match(LoggingEvent event) { if (event.getLevel() == level && event.getLoggerName().equals(logger)) { if (Regex.isSimpleMatchPattern(message)) { if (Regex.simpleMatch(message, event.getMessage().toString())) { saw = true; } } else { if (event.getMessage().toString().contains(message)) { saw = true; } } } }
@Override protected Query doToQuery(QueryShardContext context) throws IOException { // field names in builder can have wildcards etc, need to resolve them here Map<String, Float> resolvedFieldsAndWeights = new TreeMap<>(); // Use the default field if no fields specified if (fieldsAndWeights.isEmpty()) { resolvedFieldsAndWeights.put( resolveIndexName(context.defaultField(), context), AbstractQueryBuilder.DEFAULT_BOOST); } else { for (Map.Entry<String, Float> fieldEntry : fieldsAndWeights.entrySet()) { if (Regex.isSimpleMatchPattern(fieldEntry.getKey())) { for (String fieldName : context.mapperService().simpleMatchToIndexNames(fieldEntry.getKey())) { resolvedFieldsAndWeights.put(fieldName, fieldEntry.getValue()); } } else { resolvedFieldsAndWeights.put( resolveIndexName(fieldEntry.getKey(), context), fieldEntry.getValue()); } } } // Use standard analyzer by default if none specified Analyzer luceneAnalyzer; if (analyzer == null) { luceneAnalyzer = context.mapperService().searchAnalyzer(); } else { luceneAnalyzer = context.analysisService().analyzer(analyzer); if (luceneAnalyzer == null) { throw new QueryShardException( context, "[" + SimpleQueryStringBuilder.NAME + "] analyzer [" + analyzer + "] not found"); } } SimpleQueryParser sqp = new SimpleQueryParser(luceneAnalyzer, resolvedFieldsAndWeights, flags, settings); sqp.setDefaultOperator(defaultOperator.toBooleanClauseOccur()); Query query = sqp.parse(queryText); if (minimumShouldMatch != null && query instanceof BooleanQuery) { query = Queries.applyMinimumShouldMatch((BooleanQuery) query, minimumShouldMatch); } return query; }
/** * Returns all the fields that match the given pattern. If the pattern is prefixed with a type * then the fields will be returned with a type prefix. */ public Set<String> simpleMatchToIndexNames(String pattern) { if (!Regex.isSimpleMatchPattern(pattern)) { return ImmutableSet.of(pattern); } int dotIndex = pattern.indexOf('.'); if (dotIndex != -1) { String possibleType = pattern.substring(0, dotIndex); DocumentMapper possibleDocMapper = mappers.get(possibleType); if (possibleDocMapper != null) { Set<String> typedFields = Sets.newHashSet(); for (String indexName : possibleDocMapper.mappers().simpleMatchToIndexNames(pattern)) { typedFields.add(possibleType + "." + indexName); } return typedFields; } } return fieldMappers.simpleMatchToIndexNames(pattern); }
/** * Returns all the fields that match the given pattern, with an optional narrowing based on a list * of types. */ public Set<String> simpleMatchToIndexNames(String pattern, @Nullable String[] types) { if (types == null || types.length == 0) { return simpleMatchToIndexNames(pattern); } if (types.length == 1 && types[0].equals("_all")) { return simpleMatchToIndexNames(pattern); } if (!Regex.isSimpleMatchPattern(pattern)) { return ImmutableSet.of(pattern); } Set<String> fields = Sets.newHashSet(); for (String type : types) { DocumentMapper possibleDocMapper = mappers.get(type); if (possibleDocMapper != null) { for (String indexName : possibleDocMapper.mappers().simpleMatchToIndexNames(pattern)) { fields.add(indexName); } } } return fields; }
private ImmutableMap<String, FieldMappingMetaData> findFieldMappingsByType( DocumentMapper documentMapper, GetFieldMappingsIndexRequest request) throws ElasticsearchException { MapBuilder<String, FieldMappingMetaData> fieldMappings = new MapBuilder<>(); final List<FieldMapper> allFieldMappers = documentMapper.mappers().mappers(); for (String field : request.fields()) { if (Regex.isMatchAllPattern(field)) { for (FieldMapper fieldMapper : allFieldMappers) { addFieldMapper( fieldMapper.names().fullName(), fieldMapper, fieldMappings, request.includeDefaults()); } } else if (Regex.isSimpleMatchPattern(field)) { // go through the field mappers 3 times, to make sure we give preference to the resolve // order: full name, index name, name. // also make sure we only store each mapper once. boolean[] resolved = new boolean[allFieldMappers.size()]; for (int i = 0; i < allFieldMappers.size(); i++) { FieldMapper fieldMapper = allFieldMappers.get(i); if (Regex.simpleMatch(field, fieldMapper.names().fullName())) { addFieldMapper( fieldMapper.names().fullName(), fieldMapper, fieldMappings, request.includeDefaults()); resolved[i] = true; } } for (int i = 0; i < allFieldMappers.size(); i++) { if (resolved[i]) { continue; } FieldMapper fieldMapper = allFieldMappers.get(i); if (Regex.simpleMatch(field, fieldMapper.names().indexName())) { addFieldMapper( fieldMapper.names().indexName(), fieldMapper, fieldMappings, request.includeDefaults()); resolved[i] = true; } } for (int i = 0; i < allFieldMappers.size(); i++) { if (resolved[i]) { continue; } FieldMapper fieldMapper = allFieldMappers.get(i); if (Regex.simpleMatch(field, fieldMapper.names().name())) { addFieldMapper( fieldMapper.names().name(), fieldMapper, fieldMappings, request.includeDefaults()); resolved[i] = true; } } } else { // not a pattern FieldMapper fieldMapper = documentMapper.mappers().smartNameFieldMapper(field); if (fieldMapper != null) { addFieldMapper(field, fieldMapper, fieldMappings, request.includeDefaults()); } else if (request.probablySingleFieldRequest()) { fieldMappings.put(field, FieldMappingMetaData.NULL); } } } return fieldMappings.immutableMap(); }
/** * Filters out list of available indices based on the list of selected indices. * * @param availableIndices list of available indices * @param selectedIndices list of selected indices * @param indicesOptions ignore indices flag * @return filtered out indices */ public static List<String> filterIndices( List<String> availableIndices, String[] selectedIndices, IndicesOptions indicesOptions) { if (selectedIndices == null || selectedIndices.length == 0) { return availableIndices; } Set<String> result = null; for (int i = 0; i < selectedIndices.length; i++) { String indexOrPattern = selectedIndices[i]; boolean add = true; if (!indexOrPattern.isEmpty()) { if (availableIndices.contains(indexOrPattern)) { if (result != null) { result.add(indexOrPattern); } continue; } if (indexOrPattern.charAt(0) == '+') { add = true; indexOrPattern = indexOrPattern.substring(1); // if its the first, add empty set if (i == 0) { result = new HashSet<>(); } } else if (indexOrPattern.charAt(0) == '-') { // if its the first, fill it with all the indices... if (i == 0) { result = new HashSet<>(availableIndices); } add = false; indexOrPattern = indexOrPattern.substring(1); } } if (indexOrPattern.isEmpty() || !Regex.isSimpleMatchPattern(indexOrPattern)) { if (!availableIndices.contains(indexOrPattern)) { if (!indicesOptions.ignoreUnavailable()) { throw new IndexMissingException(new Index(indexOrPattern)); } else { if (result == null) { // add all the previous ones... result = new HashSet<>(); result.addAll(availableIndices.subList(0, i)); } } } else { if (result != null) { if (add) { result.add(indexOrPattern); } else { result.remove(indexOrPattern); } } } continue; } if (result == null) { // add all the previous ones... result = new HashSet<>(); result.addAll(availableIndices.subList(0, i)); } boolean found = false; for (String index : availableIndices) { if (Regex.simpleMatch(indexOrPattern, index)) { found = true; if (add) { result.add(index); } else { result.remove(index); } } } if (!found && !indicesOptions.allowNoIndices()) { throw new IndexMissingException(new Index(indexOrPattern)); } } if (result == null) { return ImmutableList.copyOf(selectedIndices); } return ImmutableList.copyOf(result); }
@Override public void execute(SearchContext context) { final FieldsVisitor fieldsVisitor; Set<String> fieldNames = null; List<String> fieldNamePatterns = null; StoredFieldsContext storedFieldsContext = context.storedFieldsContext(); if (storedFieldsContext == null) { // no fields specified, default to return source if no explicit indication if (!context.hasScriptFields() && !context.hasFetchSourceContext()) { context.fetchSourceContext(new FetchSourceContext(true)); } fieldsVisitor = new FieldsVisitor(context.sourceRequested()); } else if (storedFieldsContext.fetchFields() == false) { // disable stored fields entirely fieldsVisitor = null; } else { for (String fieldName : context.storedFieldsContext().fieldNames()) { if (fieldName.equals(SourceFieldMapper.NAME)) { if (context.hasFetchSourceContext()) { context.fetchSourceContext().fetchSource(true); } else { context.fetchSourceContext(new FetchSourceContext(true)); } continue; } if (Regex.isSimpleMatchPattern(fieldName)) { if (fieldNamePatterns == null) { fieldNamePatterns = new ArrayList<>(); } fieldNamePatterns.add(fieldName); } else { MappedFieldType fieldType = context.smartNameFieldType(fieldName); if (fieldType == null) { // Only fail if we know it is a object field, missing paths / fields shouldn't fail. if (context.getObjectMapper(fieldName) != null) { throw new IllegalArgumentException("field [" + fieldName + "] isn't a leaf field"); } } if (fieldNames == null) { fieldNames = new HashSet<>(); } fieldNames.add(fieldName); } } boolean loadSource = context.sourceRequested(); if (fieldNames == null && fieldNamePatterns == null) { // empty list specified, default to disable _source if no explicit indication fieldsVisitor = new FieldsVisitor(loadSource); } else { fieldsVisitor = new CustomFieldsVisitor( fieldNames == null ? Collections.emptySet() : fieldNames, fieldNamePatterns == null ? Collections.emptyList() : fieldNamePatterns, loadSource); } } InternalSearchHit[] hits = new InternalSearchHit[context.docIdsToLoadSize()]; FetchSubPhase.HitContext hitContext = new FetchSubPhase.HitContext(); for (int index = 0; index < context.docIdsToLoadSize(); index++) { int docId = context.docIdsToLoad()[context.docIdsToLoadFrom() + index]; int readerIndex = ReaderUtil.subIndex(docId, context.searcher().getIndexReader().leaves()); LeafReaderContext subReaderContext = context.searcher().getIndexReader().leaves().get(readerIndex); int subDocId = docId - subReaderContext.docBase; final InternalSearchHit searchHit; try { int rootDocId = findRootDocumentIfNested(context, subReaderContext, subDocId); if (rootDocId != -1) { searchHit = createNestedSearchHit( context, docId, subDocId, rootDocId, fieldNames, fieldNamePatterns, subReaderContext); } else { searchHit = createSearchHit(context, fieldsVisitor, docId, subDocId, subReaderContext); } } catch (IOException e) { throw ExceptionsHelper.convertToElastic(e); } hits[index] = searchHit; hitContext.reset(searchHit, subReaderContext, subDocId, context.searcher()); for (FetchSubPhase fetchSubPhase : fetchSubPhases) { fetchSubPhase.hitExecute(context, hitContext); } } for (FetchSubPhase fetchSubPhase : fetchSubPhases) { fetchSubPhase.hitsExecute(context, hits); } context .fetchResult() .hits( new InternalSearchHits( hits, context.queryResult().topDocs().totalHits, context.queryResult().topDocs().getMaxScore())); }