2009-07-27 5 views
5

У меня есть поле компании в индексе Lucene. Одно из названий компаний, индексированных: Moody'sСохранение слов с апострофом в индексе Lucene

Когда пользователь вводит одно из следующих ключевых слов, я хочу, чтобы эта компания попала в результаты поиска. 1.Moo 2.Mood 3.Moodys 4.Moody-х

Как я должен хранить этот показатель в Lucene и какой тип Lucene Query я должен использовать, чтобы получить такое поведение?

Спасибо.

+0

Ответ зависит от того, как вы хотите построить остальную часть вашего индекса: 1. Следует ли представить плюрализацию? то есть «Яблоко» и «Яблоки» отличаются? 2. Вы хотите сохранить апострофы, или их можно стереть? 3. Является ли название компании изолированным или внутри более крупного поля? –

+0

спасибо за ур комментариев ... мой ответ 1.No 2.I хочу, чтобы Lucene не сохраняла апострофы 3. Название компании может отображаться как изолированное, так и в большем поле – Jimmy

ответ

9

Исходя из ваших уточнений, я хочу, чтобы разделить вопрос на две части, и ответить на каждый в свою очередь:

  1. Как я индексировать слова с апострофа как эквивалент подобных слов без апострофа? например картографирование Moodys и Moody's с тем же индексом.
  2. Как реализовать автоматический поиск в Lucene - т. Е. С учетом индекса, найти документы с использованием префиксов слов, например. карта Moo до Moodys?

-относительно легко - Используйте StandardToeknizer создать маркер, сочетающий апостроф и S с предыдущим словом, то StandardFilter удалить апостроф и с. Это превратит Moody's в Moody. A StandardAnalyzer делает это и многое другое (удаление нижнего и конечного слова), что может быть больше, чем вам нужно. Использование штокера должно принимать как Moodys, так и Moody к тому же токену. Попробуйте SnowBallFilter.

2 сложнее: Lucene's PrefixQuery, на который ссылается Алан, будет работать только тогда, когда название компании будет первым словом в поле. Вам нужно что-то вроде ответа на this question about auto-complete in Lucene.

1

StandardAnalyser должен работать на 3 и 4, однако, не будет работать 1 и 2.

Без написания собственных (сложный) текстовый анализатор, я хотел бы думать о том, как вы ожидали названия компании, чтобы быть искали. Например, основной синтаксис поиска lucene означает, что вы можете найти «Moody's», если будете искать с помощью подстановочных знаков: «Moo *» и «Mood *». Поэтому вам может потребоваться добавить «*» в поисковый запрос перед отправкой на lucene, однако это может вызвать некоторую путаницу, если пользователь не знает об этом дополнении под капотом.

Смежные вопросы