Предложение тегов в среде Java/MySQL/Hibernate Search/Lucene

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

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

В дополнение к вышесказанному мы хотим реализовать предложения тегов (в основном то, что есть в StackOverflow). Мы хотели бы предложить теги на основе существующих тегов в нашей базе данных, а когда нет подходящих тегов, мы также хотели бы предложить теги «на ровном месте», возможно, используя какую-то библиотеку tf-idf или что-то в этом роде. Мой вопрос двоякий:

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

  2. Существуют ли какие-либо инструменты/библиотеки, которые мы могли бы использовать, чтобы дать нам эти предложения, которые также дают нам определение основы и т. Д. Даже, возможно, сопоставление синонимов. Наши данные в настоящее время хранятся в MySQL, и мы также используем Hibernate Search, поэтому они также хранятся в индексах Lucene (хотя в настоящее время мы не взаимодействуем с ними напрямую, только через Hibernate Search). Мы открыты для хранения этих данных в другом типе источника данных, если это поможет ситуации.


person brent777    schedule 10.06.2014    source источник


Ответы (1)


  1. Выполнение поиска при каждом нажатии клавиши действительно осуществимо, наше приложение в настоящее время делает это с базой установки в пару миллионов клиентов (хотя они не все ищут одновременно). Я, вероятно, предложил бы ввести небольшую задержку (пару секунд или около того) перед попыткой найти теги, чтобы уменьшить нагрузку на ваш сервер, а также предотвратить слишком частое обновление списка тегов.
  2. Hibernate Search (через Lucene) должен предоставить вам необходимую функциональность. Ключом к поиску будет установка надлежащего анализатора для ваших полей, чтобы правильно обрабатывать синонимы и основы (например, Lucene EnglishAnalyzer, который обеспечивает удаление стоп-слов, таких как «the» и «and», и использует стеммер Porter для обеспечить функциональность определения основы, возможно, в сочетании с SynonymFilter, инициализированным вашими синонимами).
person RandomMooCow    schedule 10.06.2014
comment
спасибо @RandomMooCow, который помог мне начать работу. Я поиграл с EnglishAnalyzer, и, кажется, он работает нормально, но у меня есть несколько вопросов: кажется, что он не возвращает точных совпадений в случае, когда поисковый запрос — это когда из слов, которые будут получены. Например, если у вас есть 2 тега: рок и рок и вы вводите рок, то запрос возвращает только рок. Это желаемое поведение? - person brent777; 11.06.2014
comment
во-вторых, я хотел бы немного больше понять алгоритм, который вы используете. Выполняете ли вы какую-либо предварительную обработку текста, который вводит пользователь, прежде чем предлагать тег? Или вы просто используете полный текст в качестве условия поиска каждый раз, когда запускаете запрос? Как выглядит ваш запрос lucene с учетом строки randomText, где randomText — это именно то, что пользователь ввел до сих пор? - person brent777; 11.06.2014
comment
Я читал об этом немного больше в Hibernate Search in Action, а потом понял, что нужно указывать анализатор при индексации (через @Field) и при запросе. Раньше я делал это только во время запроса. Теперь, когда я изменил это, мой запрос также возвращает качание - это то, что я ожидал и нуждался. Я также внедрил FuzzyQuery для обработки опечаток, но запускаю его только в том случае, если стандартный запрос возвращает слишком мало предложений. Я выполняю это как отдельный запрос, так как он лучше работает со StandardAnalyzer. Кроме того, я решил пока не использовать SynonymFilter. - person brent777; 14.06.2014