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