Как выполнить поиск «содержит», а не «начинать с», используя Lucene.Net - PullRequest
12 голосов
/ 30 марта 2011

Мы используем Lucene.NET для осуществления полнотекстового поиска на веб-сайте клиентов. Сам поиск уже работает, но теперь мы хотим реализовать модификацию.

В настоящее время все термины добавляются *, что заставляет Lucene выполнить то, что я бы классифицировал как StartsWith поиск.

В будущем мы хотели бы иметь поиск, который выполняет что-то вроде Contains, а не StartsWith.

Мы используем

  • Lucene.Net 2.9.2.2
  • StandardAnalyzer
  • QueryParser по умолчанию

Примеры:

(Title:Orch*) совпадений: Orchestra

но:

(Title:rch*) не соответствует: Orchestra

Мы хотим, чтобы первое и второе совпадали Orchestra.

По сути, я хочу прямо противоположное тому, что было задано в этом вопросе, я не уверен, почему для этого человека Lucene выполнил Contains, а не StartsWith по умолчанию:
Почему этот запрос Lucene "содержит" вместо "startWith"?

Как мы можем это сделать?
У меня такое чувство, что это как-то связано с анализатором, но я не уверен.

Ответы [ 2 ]

20 голосов
/ 30 марта 2011

Во-первых, я предполагаю, что вы используете StandardAnalyzer или что-то подобное. Ваш связанный вопрос не может понять, что вы ищете термины, и его случай a* будет совпадать с "Fleet Africa", потому что он маркирован на "fleet" и "africa".

Вам нужно позвонить QueryParser.SetAllowLeadingWildcard(true), чтобы иметь возможность писать запросы, например field:*value*. Вы действительно меняете строку, переданную в QueryParser?

Вы можете проанализировать запрос как обычно, а затем реализовать QueryVisitor , который переписывает все TermQuery в WildcardQuery. Таким образом, вы все еще поддерживаете поиск фраз.

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

2 голосов
/ 30 марта 2011

@ Саймон Свенссон, вероятно, дал лучший ответ (т.е. вам это не нужно), но если вы это сделаете, вам следует использовать Shingle Filter .

Обратите внимание, что это сделаетваш индекс значительно больше, поскольку вместо простого хранения «orchestra» вы будете хранить «orc», «rch», «che», «hes» ... Но просто запрос простого термина с ведущими подстановочными знаками будет очень медленным.По сути, ему придется просматривать все термины в вашем корпусе.

...