예제 #1
0
        protected override IEnumerable <ParseResult> ParseImpl(ParseInput input, IEnumerable <FacetMoniker> indexEntries)
        {
            var increment = 1.0 / input.Terms.Count;

            foreach (var entry in indexEntries)
            {
                var relevance = 0.0;
                var lower     = entry.DisplayName.ToLower();
                var range     = new ParseRange(0, 0);

                foreach (var term in input.Terms)
                {
                    if (lower.StartsWith(term.TextLower))
                    {
                        relevance += increment * 1.5;
                    }
                    else if (lower.Contains(term.TextLower))
                    {
                        relevance += increment;
                    }
                    else
                    {
                        // require constant progress
                        break;
                    }

                    range = range.Union(term.Range);

                    if (relevance > 0.0)
                    {
                        yield return(new ParseResult(input, range, entry, Math.Min(1.0, relevance)));
                    }
                }
            }
        }
        protected override IEnumerable <ParseResult> ParseImpl(ParseInput input, IEnumerable <FacetMoniker> indexEntries)
        {
            foreach (var entry in indexEntries)
            {
                var ci = ContactInfo.FromXml(entry.FactoryData);

                var relevance = 0.0;

                ParseRange firstNameRange = null;
                ParseRange lastNameRange  = null;
                ParseRange emailRange     = null;

                foreach (var term in input.Terms)
                {
                    if (firstNameRange == null)
                    {
                        if (ApplyRelevance(ref relevance, ci.FirstName, term.TextLower) > 0)
                        {
                            firstNameRange = term.Range;
                            continue;
                        }
                    }

                    if (lastNameRange == null)
                    {
                        if (ApplyRelevance(ref relevance, ci.LastName, term.TextLower) > 0)
                        {
                            lastNameRange = term.Range;
                            continue;
                        }
                    }

                    if (emailRange == null)
                    {
                        if (ApplyRelevance(ref relevance, ci.Email, term.TextLower) > 0)
                        {
                            emailRange = term.Range;
                            continue;
                        }
                    }
                }

                if (relevance == 0.0 ||
                    ((firstNameRange != null && lastNameRange != null) &&
                     lastNameRange.StartIndex <= firstNameRange.StartIndex))
                {
                    continue;
                }

                // determine the input range that caused the match
                ParseRange range;

                if (firstNameRange != null)
                {
                    if (lastNameRange != null)
                    {
                        range = firstNameRange.Union(lastNameRange);
                    }
                    else
                    {
                        range = firstNameRange;
                    }
                }
                else if (lastNameRange != null)
                {
                    range = lastNameRange;
                }
                else
                {
                    range = emailRange;
                }

                yield return(new ParseResult(input, range, entry, relevance));
            }
        }