Как выполнить частичный поиск слов в Lucene.NET? - PullRequest
9 голосов
/ 04 декабря 2009

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

Мой индекс содержит документы с полем Location, содержащим такие значения, как

  • Огайо
  • Дейтон, Огайо
  • Дублин, Огайо
  • Колумбус, штат Огайо

Я хочу, чтобы я мог набрать "ohi", чтобы все эти результаты появлялись, и сейчас ничего не отображается, пока я не наберу полное слово "ohio".

Я использую Lucene.NET v2.3.2.1, и соответствующая часть моего кода выглядит следующим образом для настройки моего запроса ....

BooleanQuery keywords = new BooleanQuery();
QueryParser parser = new QueryParser("location", new StandardAnalyzer());
parser.SetAllowLeadingWildcard(true);
keywords.Add(parser.Parse("\"*" + location + "*\""), BooleanClause.Occur.SHOULD);
luceneQuery.Add(keywords, BooleanClause.Occur.MUST);

Короче говоря, я бы хотел, чтобы это работало как предложение LIKE, подобное

SELECT * from Location where Name LIKE '%ohi%'

Могу ли я сделать это с Lucene?

Ответы [ 3 ]

14 голосов
/ 04 декабря 2009

Попробуйте этот запрос:

parser.Parse(query.Keywords.ToLower() + "*")
1 голос
/ 04 декабря 2009

Да, это можно сделать. Но ведущий шаблон может привести к медленным запросам. Проверьте документацию . Кроме того, если вы индексируете всю строку (например, «Дейтон, Огайо») как один токен, большинство запросов выродятся в ведущие запросы с префиксами. Использование токенизатора, такого как StandardAnalyzer (который, я полагаю, вы уже делаете), уменьшит требование для подстановочного знака.

Если вам не нужны ведущие префиксы по соображениям производительности, вы можете попробовать индексировать ngram. Таким образом, не будет никаких подстановочных запросов. Токенайзер ngram (только с длиной 4) создаст токены для "Dayton Ohio" в виде "dayt", "ayto", "yton" и т. Д.

0 голосов
/ 04 декабря 2009

это скорее вопрос заполнения вашего индекса частичными словами. Вашему анализатору необходимо вставить в индекс частичные ключевые слова, так как он анализирует (и, надеюсь, их вес будет ниже, чем у целых ключевых слов).

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

люди обычно используют действительно креативные анализаторы, которые разбивают слова на корневые слова (которые снимают префиксы и суффиксы).

погрузись в глубокое понимание люцена. это хорошие вещи. : -)

...