Поиск точного соответствия с помощью 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.