Search in sources :

Example 11 with Mapper

use of org.opensearch.index.mapper.Mapper in project OpenSearch by opensearch-project.

the class CategoryContextMappingTests method testIndexingWithMixedTypeContextList.

public void testIndexingWithMixedTypeContextList() throws Exception {
    String mapping = Strings.toString(jsonBuilder().startObject().startObject("properties").startObject("completion").field("type", "completion").startArray("contexts").startObject().field("name", "ctx").field("type", "category").endObject().endArray().endObject().endObject().endObject());
    DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser().parse("type1", new CompressedXContent(mapping));
    Mapper fieldMapper = defaultMapper.mappers().getMapper("completion");
    ParsedDocument parsedDocument = defaultMapper.parse(new SourceToParse("test", "1", BytesReference.bytes(jsonBuilder().startObject().startObject("completion").array("input", "suggestion5", "suggestion6", "suggestion7").startObject("contexts").array("ctx", "ctx1", true, 100).endObject().field("weight", 5).endObject().endObject()), XContentType.JSON));
    IndexableField[] fields = parsedDocument.rootDoc().getFields(fieldMapper.name());
    assertContextSuggestFields(fields, 3);
}
Also used : IndexableField(org.apache.lucene.index.IndexableField) KeywordFieldMapper(org.opensearch.index.mapper.KeywordFieldMapper) Mapper(org.opensearch.index.mapper.Mapper) DocumentMapper(org.opensearch.index.mapper.DocumentMapper) TextFieldMapper(org.opensearch.index.mapper.TextFieldMapper) ParsedDocument(org.opensearch.index.mapper.ParsedDocument) DocumentMapper(org.opensearch.index.mapper.DocumentMapper) CompressedXContent(org.opensearch.common.compress.CompressedXContent) SourceToParse(org.opensearch.index.mapper.SourceToParse) Matchers.containsString(org.hamcrest.Matchers.containsString)

Example 12 with Mapper

use of org.opensearch.index.mapper.Mapper in project OpenSearch by opensearch-project.

the class ShardGetService method innerGetLoadFromStoredFields.

private GetResult innerGetLoadFromStoredFields(String id, String[] storedFields, FetchSourceContext fetchSourceContext, Engine.GetResult get, MapperService mapperService) {
    assert get.exists() : "method should only be called if document could be retrieved";
    // check first if stored fields to be loaded don't contain an object field
    DocumentMapper docMapper = mapperService.documentMapper();
    if (storedFields != null) {
        for (String field : storedFields) {
            Mapper fieldMapper = docMapper.mappers().getMapper(field);
            if (fieldMapper == null) {
                if (docMapper.objectMappers().get(field) != null) {
                    // Only fail if we know it is a object field, missing paths / fields shouldn't fail.
                    throw new IllegalArgumentException("field [" + field + "] isn't a leaf field");
                }
            }
        }
    }
    Map<String, DocumentField> documentFields = null;
    Map<String, DocumentField> metadataFields = null;
    BytesReference source = null;
    DocIdAndVersion docIdAndVersion = get.docIdAndVersion();
    // force fetching source if we read from translog and need to recreate stored fields
    boolean forceSourceForComputingTranslogStoredFields = get.isFromTranslog() && storedFields != null && Stream.of(storedFields).anyMatch(f -> TranslogLeafReader.ALL_FIELD_NAMES.contains(f) == false);
    FieldsVisitor fieldVisitor = buildFieldsVisitors(storedFields, forceSourceForComputingTranslogStoredFields ? FetchSourceContext.FETCH_SOURCE : fetchSourceContext);
    if (fieldVisitor != null) {
        try {
            docIdAndVersion.reader.document(docIdAndVersion.docId, fieldVisitor);
        } catch (IOException e) {
            throw new OpenSearchException("Failed to get id [" + id + "]", e);
        }
        source = fieldVisitor.source();
        // in case we read from translog, some extra steps are needed to make _source consistent and to load stored fields
        if (get.isFromTranslog()) {
            // just make source consistent by reapplying source filters from mapping (possibly also nulling the source)
            if (forceSourceForComputingTranslogStoredFields == false) {
                try {
                    source = indexShard.mapperService().documentMapper().sourceMapper().applyFilters(source, null);
                } catch (IOException e) {
                    throw new OpenSearchException("Failed to reapply filters for [" + id + "] after reading from translog", e);
                }
            } else {
                // Slow path: recreate stored fields from original source
                assert source != null : "original source in translog must exist";
                SourceToParse sourceToParse = new SourceToParse(shardId.getIndexName(), id, source, XContentHelper.xContentType(source), fieldVisitor.routing());
                ParsedDocument doc = indexShard.mapperService().documentMapper().parse(sourceToParse);
                assert doc.dynamicMappingsUpdate() == null : "mapping updates should not be required on already-indexed doc";
                // update special fields
                doc.updateSeqID(docIdAndVersion.seqNo, docIdAndVersion.primaryTerm);
                doc.version().setLongValue(docIdAndVersion.version);
                // retrieve stored fields from parsed doc
                fieldVisitor = buildFieldsVisitors(storedFields, fetchSourceContext);
                for (IndexableField indexableField : doc.rootDoc().getFields()) {
                    IndexableFieldType fieldType = indexableField.fieldType();
                    if (fieldType.stored()) {
                        FieldInfo fieldInfo = new FieldInfo(indexableField.name(), 0, false, false, false, IndexOptions.NONE, DocValuesType.NONE, -1, Collections.emptyMap(), 0, 0, 0, 0, VectorSimilarityFunction.EUCLIDEAN, false);
                        StoredFieldVisitor.Status status = fieldVisitor.needsField(fieldInfo);
                        if (status == StoredFieldVisitor.Status.YES) {
                            if (indexableField.numericValue() != null) {
                                fieldVisitor.objectField(fieldInfo, indexableField.numericValue());
                            } else if (indexableField.binaryValue() != null) {
                                fieldVisitor.binaryField(fieldInfo, indexableField.binaryValue());
                            } else if (indexableField.stringValue() != null) {
                                fieldVisitor.objectField(fieldInfo, indexableField.stringValue());
                            }
                        } else if (status == StoredFieldVisitor.Status.STOP) {
                            break;
                        }
                    }
                }
                // retrieve source (with possible transformations, e.g. source filters
                source = fieldVisitor.source();
            }
        }
        // put stored fields into result objects
        if (!fieldVisitor.fields().isEmpty()) {
            fieldVisitor.postProcess(mapperService::fieldType);
            documentFields = new HashMap<>();
            metadataFields = new HashMap<>();
            for (Map.Entry<String, List<Object>> entry : fieldVisitor.fields().entrySet()) {
                if (mapperService.isMetadataField(entry.getKey())) {
                    metadataFields.put(entry.getKey(), new DocumentField(entry.getKey(), entry.getValue()));
                } else {
                    documentFields.put(entry.getKey(), new DocumentField(entry.getKey(), entry.getValue()));
                }
            }
        }
    }
    if (source != null) {
        // apply request-level source filtering
        if (fetchSourceContext.fetchSource() == false) {
            source = null;
        } else if (fetchSourceContext.includes().length > 0 || fetchSourceContext.excludes().length > 0) {
            Map<String, Object> sourceAsMap;
            // TODO: The source might be parsed and available in the sourceLookup but that one uses unordered maps so different.
            // Do we care?
            Tuple<XContentType, Map<String, Object>> typeMapTuple = XContentHelper.convertToMap(source, true);
            XContentType sourceContentType = typeMapTuple.v1();
            sourceAsMap = typeMapTuple.v2();
            sourceAsMap = XContentMapValues.filter(sourceAsMap, fetchSourceContext.includes(), fetchSourceContext.excludes());
            try {
                source = BytesReference.bytes(XContentFactory.contentBuilder(sourceContentType).map(sourceAsMap));
            } catch (IOException e) {
                throw new OpenSearchException("Failed to get id [" + id + "] with includes/excludes set", e);
            }
        }
    }
    if (!fetchSourceContext.fetchSource()) {
        source = null;
    }
    if (source != null && get.isFromTranslog()) {
        // reapply source filters from mapping (possibly also nulling the source)
        try {
            source = docMapper.sourceMapper().applyFilters(source, null);
        } catch (IOException e) {
            throw new OpenSearchException("Failed to reapply filters for [" + id + "] after reading from translog", e);
        }
    }
    if (source != null && (fetchSourceContext.includes().length > 0 || fetchSourceContext.excludes().length > 0)) {
        Map<String, Object> sourceAsMap;
        // TODO: The source might parsed and available in the sourceLookup but that one uses unordered maps so different. Do we care?
        Tuple<XContentType, Map<String, Object>> typeMapTuple = XContentHelper.convertToMap(source, true);
        XContentType sourceContentType = typeMapTuple.v1();
        sourceAsMap = typeMapTuple.v2();
        sourceAsMap = XContentMapValues.filter(sourceAsMap, fetchSourceContext.includes(), fetchSourceContext.excludes());
        try {
            source = BytesReference.bytes(XContentFactory.contentBuilder(sourceContentType).map(sourceAsMap));
        } catch (IOException e) {
            throw new OpenSearchException("Failed to get id [" + id + "] with includes/excludes set", e);
        }
    }
    return new GetResult(shardId.getIndexName(), id, get.docIdAndVersion().seqNo, get.docIdAndVersion().primaryTerm, get.version(), get.exists(), source, documentFields, metadataFields);
}
Also used : IdFieldMapper(org.opensearch.index.mapper.IdFieldMapper) IndexableField(org.apache.lucene.index.IndexableField) VectorSimilarityFunction(org.apache.lucene.index.VectorSimilarityFunction) Term(org.apache.lucene.index.Term) StoredFieldVisitor(org.apache.lucene.index.StoredFieldVisitor) OpenSearchException(org.opensearch.OpenSearchException) MapperService(org.opensearch.index.mapper.MapperService) Map(java.util.Map) XContentFactory(org.opensearch.common.xcontent.XContentFactory) FieldsVisitor(org.opensearch.index.fieldvisitor.FieldsVisitor) Nullable(org.opensearch.common.Nullable) Tuple(org.opensearch.common.collect.Tuple) Engine(org.opensearch.index.engine.Engine) VersionType(org.opensearch.index.VersionType) List(java.util.List) Stream(java.util.stream.Stream) DocIdAndVersion(org.opensearch.common.lucene.uid.VersionsAndSeqNoResolver.DocIdAndVersion) IndexSettings(org.opensearch.index.IndexSettings) XContentType(org.opensearch.common.xcontent.XContentType) RoutingFieldMapper(org.opensearch.index.mapper.RoutingFieldMapper) Uid(org.opensearch.index.mapper.Uid) CustomFieldsVisitor(org.opensearch.index.fieldvisitor.CustomFieldsVisitor) BytesReference(org.opensearch.common.bytes.BytesReference) HashMap(java.util.HashMap) MeanMetric(org.opensearch.common.metrics.MeanMetric) SourceToParse(org.opensearch.index.mapper.SourceToParse) IndexShard(org.opensearch.index.shard.IndexShard) UNASSIGNED_SEQ_NO(org.opensearch.index.seqno.SequenceNumbers.UNASSIGNED_SEQ_NO) IndexableFieldType(org.apache.lucene.index.IndexableFieldType) ParsedDocument(org.opensearch.index.mapper.ParsedDocument) Versions(org.opensearch.common.lucene.uid.Versions) AbstractIndexShardComponent(org.opensearch.index.shard.AbstractIndexShardComponent) IOException(java.io.IOException) DocumentField(org.opensearch.common.document.DocumentField) Mapper(org.opensearch.index.mapper.Mapper) UNASSIGNED_PRIMARY_TERM(org.opensearch.index.seqno.SequenceNumbers.UNASSIGNED_PRIMARY_TERM) SourceFieldMapper(org.opensearch.index.mapper.SourceFieldMapper) DocumentMapper(org.opensearch.index.mapper.DocumentMapper) XContentHelper(org.opensearch.common.xcontent.XContentHelper) TimeUnit(java.util.concurrent.TimeUnit) Sets(org.opensearch.common.util.set.Sets) TranslogLeafReader(org.opensearch.index.engine.TranslogLeafReader) DocValuesType(org.apache.lucene.index.DocValuesType) FieldInfo(org.apache.lucene.index.FieldInfo) CounterMetric(org.opensearch.common.metrics.CounterMetric) XContentMapValues(org.opensearch.common.xcontent.support.XContentMapValues) IndexOptions(org.apache.lucene.index.IndexOptions) Collections(java.util.Collections) FetchSourceContext(org.opensearch.search.fetch.subphase.FetchSourceContext) FieldsVisitor(org.opensearch.index.fieldvisitor.FieldsVisitor) CustomFieldsVisitor(org.opensearch.index.fieldvisitor.CustomFieldsVisitor) DocumentField(org.opensearch.common.document.DocumentField) IdFieldMapper(org.opensearch.index.mapper.IdFieldMapper) RoutingFieldMapper(org.opensearch.index.mapper.RoutingFieldMapper) Mapper(org.opensearch.index.mapper.Mapper) SourceFieldMapper(org.opensearch.index.mapper.SourceFieldMapper) DocumentMapper(org.opensearch.index.mapper.DocumentMapper) XContentType(org.opensearch.common.xcontent.XContentType) ParsedDocument(org.opensearch.index.mapper.ParsedDocument) StoredFieldVisitor(org.apache.lucene.index.StoredFieldVisitor) List(java.util.List) BytesReference(org.opensearch.common.bytes.BytesReference) DocumentMapper(org.opensearch.index.mapper.DocumentMapper) SourceToParse(org.opensearch.index.mapper.SourceToParse) IOException(java.io.IOException) IndexableField(org.apache.lucene.index.IndexableField) DocIdAndVersion(org.opensearch.common.lucene.uid.VersionsAndSeqNoResolver.DocIdAndVersion) IndexableFieldType(org.apache.lucene.index.IndexableFieldType) OpenSearchException(org.opensearch.OpenSearchException) Map(java.util.Map) HashMap(java.util.HashMap) FieldInfo(org.apache.lucene.index.FieldInfo) Tuple(org.opensearch.common.collect.Tuple)

Example 13 with Mapper

use of org.opensearch.index.mapper.Mapper in project OpenSearch by opensearch-project.

the class TransportGetFieldMappingsIndexAction method findFieldMappings.

private static Map<String, FieldMappingMetadata> findFieldMappings(Predicate<String> fieldPredicate, DocumentMapper documentMapper, GetFieldMappingsIndexRequest request) {
    if (documentMapper == null) {
        return Collections.emptyMap();
    }
    Map<String, FieldMappingMetadata> fieldMappings = new HashMap<>();
    final MappingLookup allFieldMappers = documentMapper.mappers();
    for (String field : request.fields()) {
        if (Regex.isMatchAllPattern(field)) {
            for (Mapper fieldMapper : allFieldMappers) {
                addFieldMapper(fieldPredicate, fieldMapper.name(), fieldMapper, fieldMappings, request.includeDefaults());
            }
        } else if (Regex.isSimpleMatchPattern(field)) {
            for (Mapper fieldMapper : allFieldMappers) {
                if (Regex.simpleMatch(field, fieldMapper.name())) {
                    addFieldMapper(fieldPredicate, fieldMapper.name(), fieldMapper, fieldMappings, request.includeDefaults());
                }
            }
        } else {
            // not a pattern
            Mapper fieldMapper = allFieldMappers.getMapper(field);
            if (fieldMapper != null) {
                addFieldMapper(fieldPredicate, field, fieldMapper, fieldMappings, request.includeDefaults());
            }
        }
    }
    return Collections.unmodifiableMap(fieldMappings);
}
Also used : Mapper(org.opensearch.index.mapper.Mapper) DocumentMapper(org.opensearch.index.mapper.DocumentMapper) HashMap(java.util.HashMap) MappingLookup(org.opensearch.index.mapper.MappingLookup) FieldMappingMetadata(org.opensearch.action.admin.indices.mapping.get.GetFieldMappingsResponse.FieldMappingMetadata)

Aggregations

Mapper (org.opensearch.index.mapper.Mapper)13 DocumentMapper (org.opensearch.index.mapper.DocumentMapper)10 IndexableField (org.apache.lucene.index.IndexableField)8 KeywordFieldMapper (org.opensearch.index.mapper.KeywordFieldMapper)8 ParsedDocument (org.opensearch.index.mapper.ParsedDocument)8 SourceToParse (org.opensearch.index.mapper.SourceToParse)8 TextFieldMapper (org.opensearch.index.mapper.TextFieldMapper)8 Matchers.containsString (org.hamcrest.Matchers.containsString)7 CompressedXContent (org.opensearch.common.compress.CompressedXContent)7 HashMap (java.util.HashMap)4 IndexSettings (org.opensearch.index.IndexSettings)4 Settings (org.opensearch.common.settings.Settings)3 XContentBuilder (org.opensearch.common.xcontent.XContentBuilder)3 ContentPath (org.opensearch.index.mapper.ContentPath)3 IOException (java.io.IOException)2 Map (java.util.Map)2 FieldMappingMetadata (org.opensearch.action.admin.indices.mapping.get.GetFieldMappingsResponse.FieldMappingMetadata)2 IndexScopedSettings (org.opensearch.common.settings.IndexScopedSettings)2 ModelDao (org.opensearch.knn.indices.ModelDao)2 Collections (java.util.Collections)1