Автозаполнение для адресов с помощью Lucene .NET - PullRequest
1 голос
/ 01 октября 2011

Мне не удалось это заколоть.Я пробовал несколько разных анализаторов, и все они сближают меня, но не совсем то, что я хочу.Использование SOLR на данный момент не вариант.

Примеры того, что я хотел бы:

    Input: 200
    Matches:  200 E Dragon Dr.
              200 W Paragon Rd.
              200 Lick Skillet Dr.

    Input: 200 E
    Matches:  200 E Dragon Dr.
              200 E Toll Rd.

    Input: 200 E D
    Matches: 200 E Dragon Dr.

Если я использую простой анализатор, он не будет совпадать по числу.Анализатор пробелов получает желаемый эффект только с помощью числа, но после добавления E он не возвращается, как я ожидал.Какой анализатор будет лучшим или я использую неправильные запросы?

Спасибо,

РЕДАКТИРОВАТЬ:

Я взял приведенный ниже ответ и сделал тонну поиска в Google, и яЯ приближаюсь только с помощью анализатора запросов и анализатора пробелов.Я просто позволяю анализатору запросов определить лучший запрос, и он, похоже, работает.

1 Ответ

1 голос
/ 01 октября 2011

попробуйте использовать анализатор ключевых слов и анализатор запросов для поиска в поле адреса в Lucene.Я использую MultiFieldQueryParser, но вы также можете использовать обычный анализатор запросов:

public StartsWithQuery Prefix(string prefix, string[] fields, Dictionary<string,string> filterFields = null )
        {
           if(!string.IsNullOrEmpty(prefix))
           {


               var parser = new MultiFieldQueryParser(Version.LUCENE_29, fields, new KeywordAnalyzer());
               var boolQuery = new BooleanQuery();

               boolQuery.Add(parser.Parse(prefix + "*"), BooleanClause.Occur.MUST);
               if (filterFields != null)
               {
                   foreach (var field in filterFields)
                   {
                        boolQuery.Add(new TermQuery(new Term(field.Key, field.Value)), BooleanClause.Occur.MUST);

                   }
               }

           }

            return this;
        }
...