Поиск точного соответствия с помощью Lucene search API

Я работаю над API поиска компании, используя Lucene. Мой индекс компании Lucene имеет 2 компании: 1.Abigail Adams National Bancorp, Inc. 2.Национальный Банкорп

Если пользователь вводит в National Bancorp, то только компания # 2(т. е. National Bancorp) должен быть возвращен, а не #1.......т. е. должны быть возвращены только точные совпадения. Как достичь этой функциональности?

Спасибо за чтение.

4 ответов


можно использовать KeywordAnalyzer индексировать и искать в этом поле. Анализатор ключевых слов будет генерировать только один токен для всей строки.


вы можете пересмотреть свои требования, в зависимости от того, правильно ли я понял ваш вопрос. Пожалуйста, голые со мной, если я правильно понял.

просто немного пищи для размышлений:

  • Если вы хотите только точно совпадений, тогда почему вы ищете в первую очередь?

  • вы уверены, что пользователь ждет точные совпадения? Я обычно ищу, предполагая, что поисковик разместит недостающие слова.

  • предположим, что пользователь искал Национальный Банк но Национальный Банк больше не было в вашем индексе. Вы все равно хотите Abigail Adams National Bancorp, Inc должна быть исключена из результатов просто потому, что это не точное совпадение?

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


Это то, что может гарантировать использование фильтра Гонта. Этот фильтр объединяет несколько слов. Например, Абигейл Адамс Национальный Bancorp с собой ShingleFilter из 3 жетонов будет производить (при условии, простой WhitespaceAnalyzer) [Эбигейл], [Абигейл Адамс], [Абигейл Адамс Национальный], [Адамс Национальный Bancorp в], [Адамс Национальный], [Адамс], [национальных], [Национальный Банкорп] и [Банкорп].

Если пользователь запрашивает National Bancorp, вы получите точное совпадение Сам Национальный Банкорп, и более низкий забил точный матч на Abigail Adams National Bancorp (ниже забил, потому что у этого есть гораздо больше токенов в поле, тем самым снижая idf). Я думаю, что имеет смысл вернуть оба документа по такому запросу.

вы можете также применить фильтр Гонта во время запроса, в зависимости от варианта использования.


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

National Bancorp вернет как #1, так и #2, но "National Bancorp" вернет только #2.