public void Should_Calculate_Levenshtein_Distance_Correctly(string source, string target, int expected)
        {
            // Given, When
            var result = LevenshteinScorer.Score(source, target, false);

            // Then
            Assert.Equal(expected, result);
        }
示例#2
0
        private static float CalculateDistance(IndexedEntry entry, string query)
        {
#if DEBUG
            return(Math.Min(LevenshteinScorer.Distance(entry.Title, query),
                            LevenshteinScorer.Distance(entry.Description ?? entry.Title, query)));
#else
            return(0);
#endif
        }
示例#3
0
        public override async Task <IEnumerable <IQueryResult> > QueryAsync(Query query)
        {
            Ensure.NotNull(query, nameof(query));

            if (string.IsNullOrWhiteSpace(query.Argument))
            {
                var uri = new Uri("https://en.wikipedia.org");
                return(new[]
                {
                    (IQueryResult) new WikipediaResult(
                        uri, "Open Wikipedia in browser",
                        uri.AbsoluteUri, 0, 0)
                });
            }

            try
            {
                var uri    = $"https://en.wikipedia.org/w/api.php?action=opensearch&profile=fuzzy&limit=5&search={Encode(query.Argument)}";
                var result = await _client.GetAsync(uri);

                if (result.IsSuccessStatusCode)
                {
                    var data = await result.Content.ReadAsStringAsync();

                    var keywords = JArray.Parse(data)[1].Where(x => x.Type == JTokenType.String).Select(x => x.Value <string>());
                    var uris     = JArray.Parse(data)[3].Where(x => x.Type == JTokenType.String).Select(x => new Uri(x.Value <string>()));

                    var results = keywords
                                  .Zip(uris, (title, url) =>
                                       (IQueryResult) new WikipediaResult(url, title, url.AbsoluteUri,
                                                                          LevenshteinScorer.Score(title, query.Argument, false),
                                                                          LevenshteinScorer.Score(title, query.Argument)))
                                  .ToList();

                    if (!results.Any())
                    {
                        var fallbackUrl = new Uri($"https://en.wikipedia.org/wiki/{Encode(query.Argument)}");
                        return(new[]
                        {
                            (IQueryResult) new WikipediaResult(
                                fallbackUrl, $"Search Wikipedia for '{query.Argument}'",
                                fallbackUrl.AbsoluteUri, 0, 0)
                        });
                    }

                    return(results);
                }
            }
            catch (Exception e)
            {
                _log.Error(e, "An error occured while querying Wikipedia.");
            }

            return(Enumerable.Empty <IQueryResult>());
        }
示例#4
0
        public static IQueryResult Create(Query query, string term = null, string description = null)
        {
            Ensure.NotNull(query, nameof(query));

            term        = term ?? query.Argument;
            description = description ?? term;

            var isGoogleQuery = !(term.StartsWith("http://") || term.StartsWith("https://"));
            var uri           = isGoogleQuery ? new Uri($"https://www.google.se/search?q={WebUtility.UrlEncode(term)}") : new Uri(term);

            return(new GoogleResult(uri, isGoogleQuery, description, uri.AbsoluteUri,
                                    isGoogleQuery ? LevenshteinScorer.Score(term, query.Argument, false) : 0,
                                    isGoogleQuery ? LevenshteinScorer.Score(term, query.Argument) : 0));
        }
示例#5
0
 private static float CalculateScore(IndexedEntry entry, string query)
 {
     return(Math.Min(LevenshteinScorer.Score(entry.Title, query),
                     LevenshteinScorer.Score(entry.Description ?? entry.Title, query)));
 }