Example #1
0
        public override IFuzzyQuery Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver)
        {
            if (reader.GetCurrentJsonToken() == JsonToken.Null)
            {
                reader.ReadNext();
                return(null);
            }

            var                   count = 0;
            IFuzzyQuery           query = null;
            string                name  = null;
            double?               boost = null;
            MultiTermQueryRewrite multiTermQueryRewrite = null;
            int?                  prefixLength          = null;
            int?                  maxExpansions         = null;
            bool?                 transpositions        = null;

            while (reader.ReadIsInObject(ref count))
            {
                var field = reader.ReadPropertyName();
                // ReSharper disable once TooWideLocalVariableScope
                ArraySegment <byte> fuzzinessSegment = default;
                var valueCount = 0;
                while (reader.ReadIsInObject(ref valueCount))
                {
                    var property = reader.ReadPropertyNameSegmentRaw();
                    if (Fields.TryGetValue(property, out var value))
                    {
                        switch (value)
                        {
                        case 0:
                        {
                            var token = reader.GetCurrentJsonToken();
                            switch (token)
                            {
                            case JsonToken.String:
                                var valueSegment = reader.ReadStringSegmentUnsafe();
                                if (valueSegment.IsDateTime(formatterResolver, out var dateTime))
                                {
                                    query = new FuzzyDateQuery
                                    {
                                        Field = field,
                                        Value = dateTime,
                                    }
                                }
                                ;
                                else
                                {
                                    query = new FuzzyQuery
                                    {
                                        Field = field,
                                        Value = valueSegment.Utf8String(),
                                    }
                                };
                                break;

                            case JsonToken.Number:
                                query = new FuzzyNumericQuery
                                {
                                    Field = field,
                                    Value = reader.ReadDouble(),
                                };
                                break;
                            }

                            if (fuzzinessSegment != default)
                            {
                                var fuzzinessReader = new JsonReader(fuzzinessSegment.Array, fuzzinessSegment.Offset);
                                SetFuzziness(ref fuzzinessReader, query, formatterResolver);
                            }
                            break;
                        }

                        case 1:
                        {
                            if (query != null)
                            {
                                SetFuzziness(ref reader, query, formatterResolver);
                            }
                            else
                            {
                                fuzzinessSegment = reader.ReadNextBlockSegment();
                            }
                            break;
                        }

                        case 2:
                            prefixLength = reader.ReadInt32();
                            break;

                        case 3:
                            maxExpansions = reader.ReadInt32();
                            break;

                        case 4:
                            transpositions = reader.ReadBoolean();
                            break;

                        case 5:
                            var rewriteFormatter = formatterResolver.GetFormatter <MultiTermQueryRewrite>();
                            multiTermQueryRewrite = rewriteFormatter.Deserialize(ref reader, formatterResolver);
                            break;

                        case 6:
                            name = reader.ReadString();
                            break;

                        case 7:
                            boost = reader.ReadDouble();
                            break;
                        }
                    }
                }
            }

            query.PrefixLength   = prefixLength;
            query.MaxExpansions  = maxExpansions;
            query.Transpositions = transpositions;
            query.Rewrite        = multiTermQueryRewrite;
            query.Name           = name;
            query.Boost          = boost;
            return(query);
        }
Example #2
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var j = JObject.Load(reader);

            if (!j.HasValues)
            {
                return(null);
            }

            var firstProp = j.Properties().FirstOrDefault();

            if (firstProp == null)
            {
                return(null);
            }

            var field = firstProp.Name;
            var jo    = firstProp.Value.Value <JObject>();

            if (jo == null)
            {
                return(null);
            }

            JToken v;

            if (!jo.TryGetValue("value", out v))
            {
                return(null);
            }

            IFuzzyQuery fq;

            if (v.Type == JTokenType.String)
            {
                fq = new FuzzyQuery
                {
                    Value     = GetPropValue <string>(jo, "value"),
                    Fuzziness = GetPropObject <Fuzziness>(jo, "fuzziness")
                }
            }
            ;
            else if (v.Type == JTokenType.Date)
            {
                fq = new FuzzyDateQuery
                {
                    Value     = GetPropValue <DateTime?>(jo, "value"),
                    Fuzziness = GetPropObject <Time>(jo, "fuzziness")
                }
            }
            ;
            else if (v.Type == JTokenType.Integer || v.Type == JTokenType.Float)
            {
                fq = new FuzzyNumericQuery
                {
                    Value     = GetPropValue <double?>(jo, "value"),
                    Fuzziness = GetPropValue <double?>(jo, "fuzziness")
                }
            }
            ;
            else
            {
                return(null);
            }

            fq.PrefixLength   = GetPropValue <int?>(jo, "prefix_length");
            fq.MaxExpansions  = GetPropValue <int?>(jo, "max_expansions");
            fq.Transpositions = GetPropValue <bool?>(jo, "transpositions");
            var rewriteString = GetPropValue <string>(jo, "rewrite");

            if (!rewriteString.IsNullOrEmpty())
            {
                fq.Rewrite = MultiTermQueryRewrite.Create(rewriteString);
            }

            fq.Name  = GetPropValue <string>(jo, "_name");
            fq.Boost = GetPropValue <double?>(jo, "boost");
            fq.Field = field;

            return(fq);
        }
Example #3
0
        private FuzzyQueryBase BuildFuzzyQuery(string fieldName, Dictionary<string, object> fieldDict)
        {
            object value = fieldDict[_VALUE];
            object fuzziness = null;
            if (fieldDict.ContainsKey(_FUZZINESS))
                fuzziness = fieldDict[_FUZZINESS];

            FuzzyQueryBase query = null;
            if (IsDateTime(value))
            {
                if(fuzziness != null)
                    query = new FuzzyDateQuery(fieldName, DateTime.Parse(value.ToString()), new TimeValue(fuzziness.ToString()).TimeSpan);
                else
                    query = new FuzzyDateQuery(fieldName, DateTime.Parse(value.ToString()));
            }
            else if (IsNumeric(value))
            {
                bool isInteger = false;
                if (value is Int64 || value is Int32)
                    isInteger = true;

                if (fuzziness != null && isInteger)
                {
                    if (isInteger)
                        query = new FuzzyNumberQuery(fieldName, (Int64)value, (Int64)fuzziness);
                    else
                        query = new FuzzyNumberQuery(fieldName, (Double)value, (Double)fuzziness);
                }
                else
                {
                    if (isInteger)
                        query = new FuzzyNumberQuery(fieldName, (Int64)value);
                    else
                        query = new FuzzyNumberQuery(fieldName, (Double)value);
                }
            }
            else
            {
                if (fuzziness != null)
                    query = new FuzzyStringQuery(fieldName, value.ToString(), Int32.Parse(fuzziness.ToString()));
                else
                    query = new FuzzyStringQuery(fieldName, value.ToString());
            }

            query.Boost = fieldDict.GetDouble(QuerySerializer._BOOST, QuerySerializer._BOOST_DEFAULT);
            query.MaximumExpansions = fieldDict.GetInt32(_MAXIMUM_EXPANSIONS, _MAXIMUM_EXPANSIONS_DEFAULT);
            query.PrefixLength = fieldDict.GetInt32(_PREFIX_LENGTH, _PREFIX_LENGTH_DEFAULT);
            query.QueryName = fieldDict.GetStringOrDefault(QuerySerializer._QUERY_NAME);
            return query;
        }