コード例 #1
0
ファイル: MatchData.cs プロジェクト: danielcrenna/lunr-core
        /// <summary>
        /// Add metadata for a term/field pair to this instance of match data.
        /// </summary>
        /// <param name="term">The term this match data is associated with.</param>
        /// <param name="field">The field in which the term was found.</param>
        /// <param name="metadata">The metadata recorded about this term in this field.</param>
        public void Add(string term, string field, FieldMatchMetadata metadata)
        {
            if (!Posting.ContainsKey(term))
            {
                Posting.Add(term, new FieldMatches
                {
                    {
                        field,
                        metadata
                    }
                });
                return;
            }

            FieldMatches termMetadata = Posting[term];

            if (!termMetadata.ContainsKey(field))
            {
                termMetadata.Add(field, metadata);
                return;
            }

            foreach (string key in metadata.Keys)
            {
                FieldMatchMetadata fieldMetadata = termMetadata[field];
                if (fieldMetadata.ContainsKey(key))
                {
                    fieldMetadata[key] = fieldMetadata[key].Concat(metadata[key]).ToList();
                }
                else
                {
                    fieldMetadata[key] = metadata[key];
                }
            }
        }
コード例 #2
0
        public override InvertedIndexEntry Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType != JsonTokenType.StartObject)
            {
                throw new JsonException("An inverted index entry can only be deserialized from an object.");
            }
            var result = new InvertedIndexEntry();

            reader.ReadOrThrow();
            while (reader.AdvanceTo(JsonTokenType.PropertyName, JsonTokenType.EndObject) != JsonTokenType.EndObject)
            {
                string fieldName = reader.ReadValue <string>(options);
                if (fieldName is "_index")
                {
                    result.Index = reader.ReadValue <int>(options);
                }
                else
                {
                    var fieldMatches = new FieldMatches();
                    reader.AdvanceTo(JsonTokenType.StartObject);
                    while (reader.AdvanceTo(JsonTokenType.PropertyName, JsonTokenType.EndObject) != JsonTokenType.EndObject)
                    {
                        string token    = reader.ReadValue <string>(options);
                        var    metadata = new FieldMatchMetadata();
                        reader.AdvanceTo(JsonTokenType.StartObject);
                        while (reader.AdvanceTo(JsonTokenType.PropertyName, JsonTokenType.EndObject) != JsonTokenType.EndObject)
                        {
                            string metadataName = reader.ReadValue <string>(options);
                            reader.AdvanceTo(JsonTokenType.StartArray);
                            reader.ReadOrThrow();
                            var data = new List <object?>();
                            while (reader.TokenType != JsonTokenType.EndArray)
                            {
                                // Special-case known metadata
                                if (metadataName is "position")
                                {
                                    data.Add(JsonSerializer.Deserialize <Slice>(ref reader, options));
                                }
                                else
                                {
                                    data.Add(reader.ReadObject(options));
                                }
                            }
                            reader.ReadOrThrow();
                            metadata.Add(metadataName, data);
                        }
                        reader.ReadOrThrow();
                        fieldMatches.Add(token, metadata);
                    }
                    reader.ReadOrThrow();
                    result.Add(fieldName, fieldMatches);
                }
            }
            reader.ReadOrThrow();
            return(result);
        }
コード例 #3
0
        public static InvertedIndexEntry DeserializeInvertedIndexEntry(this DeserializeContext context, ref ReadOnlySpan <byte> buffer)
        {
            var entry = new InvertedIndexEntry();

            entry.Index = context.ReadInt32(ref buffer);
            var fieldMatchesCount = context.ReadInt32(ref buffer);

            for (var i = 0; i < fieldMatchesCount; i++)
            {
                var fieldMatches = new FieldMatches();

                var fieldMatchesKey = context.ReadString(ref buffer);
                var fieldMatchCount = context.ReadInt32(ref buffer);

                for (var j = 0; j < fieldMatchCount; j++)
                {
                    var fieldMatchMeta = new FieldMatchMetadata();

                    var fieldMatchMetaKey   = context.ReadString(ref buffer);
                    var fieldMatchMetaCount = context.ReadInt32(ref buffer);

                    for (var k = 0; k < fieldMatchMetaCount; k++)
                    {
                        var fieldMatchMetaValueKey   = context.ReadString(ref buffer);
                        var fieldMatchMetaValueCount = context.ReadInt32(ref buffer);

                        var meta = new List <object?>(fieldMatchMetaValueCount);

                        for (var l = 0; l < fieldMatchMetaValueCount; l++)
                        {
                            if (context.ReadBoolean(ref buffer))
                            {
                                var typeName = context.ReadString(ref buffer);
                                var type     = Type.GetType(typeName);
                                if (type == null)
                                {
                                    throw new SerializationException($"no type named '{typeName}' found in loaded assemblies");
                                }

                                if (!SerializeContext.KnownTypes.TryGetValue(type, out var serializer))
                                {
                                    throw new SerializationException($"no serializer registered for '{type.Name}'");
                                }

                                var data         = context.ReadBytes(ref buffer);
                                var deserialized = serializer.Item2(data.ToArray());
                                meta.Add(deserialized);
                            }
                            else
                            {
                                meta.Add(null);
                            }
                        }

                        fieldMatchMeta.Add(fieldMatchMetaValueKey, meta);
                    }

                    fieldMatches.Add(fieldMatchMetaKey, fieldMatchMeta);
                }

                entry.Add(fieldMatchesKey, fieldMatches);
            }

            return(entry);
        }