Автозаполнение для адресов с использованием Lucene .NET

#autocomplete #lucene #lucene.net

#автозаполнение #lucene #lucene.net

Вопрос:

Я не смог разобраться с этим. Я пробовал несколько разных анализаторов, и все они мне близки, но не совсем то, что я хочу. Использование 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, он не возвращает, как я ожидаю. Какой был бы лучшим анализатором или я использую неправильные запросы?

Спасибо,

Редактировать:

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

Ответ №1:

попробуйте использовать анализатор ключевых слов и анализатор запросов для поиска по полю адреса в 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;
        }
  

Комментарии:

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

2. Спасибо, вы заставили меня двигаться в правильном направлении. У меня есть ожидаемые результаты, которые я хотел. Префиксный запрос, безусловно, является ключом к тому, чтобы заставить его работать так, как я хотел.

3. @Jamie, я прошу прощения, я должен был сказать, что мой метод был конкретной реализацией, но внутренний код — это то, что вы могли бы использовать.