Полнотекстовый поиск с постоянно обновляемыми данными - PullRequest
0 голосов
/ 23 февраля 2012

Я работаю над веб-приложением в ASP.NET MVC, которое включает довольно сложную (я думаю) ситуацию поиска.По сути, у меня есть куча записей с заголовком и содержанием.Это поля, которые я хочу предоставить для полнотекстового поиска.Уловка в том, что я также отслеживаю рейтинг этих записей (например, голосование "за" / "против").Я использую MongoDB в качестве базы данных, и у меня есть отдельная коллекция для всех этих голосов.Я планирую использовать функцию карты / уменьшения, чтобы превратить все документы в наборе голосов в единую «оценку» для статьи.Когда я выполняю поиск, я хочу, чтобы оценка статьи влияла на рейтинг.

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

Я еще не написал ни одного этого кода, поэтому, если у вас есть лучший способ решить эту проблему, пожалуйста, поделитесь.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Проблема в том, что, так как счет не является частью документа, когда я сначала создам индекс, я не знаю, как бы я настроил Lucene

В чем проблема? Просто используйте значение по умолчанию для рейтинга / голосов (вероятно, 0) и позже, когда люди проголосуют, обновите его.

Каждый раз, когда кто-то голосует за статью, нужно ли мне обновлять Lucene index?

Нет, это может быть дорого и медленно. В вашем приложении, вероятно, будет огромный объем обновлений, а lucene может быть медленным, когда вы будете часто делать сброс на диск. В целом почти для любого полнотекстового поиска обновления в реальном времени не так важны, как полнотекстовый поиск. Поэтому я предлагаю следующую стратегию:

Решение № 1:

1.Создать коллекцию в mongodb, где вы будете хранить все обновления, связанные с lucene:

{
  _id,
  title,
  content,
  rating, //increment it 
  status(new, updated, delete) // you need this for lucene
}

2. После этого вам необходимо создать инструмент, который будет обрабатывать все эти обновления в фоновом режиме (например, раз в 10 минут). Просто помните, что вам нужно сбросить данные на диск, скажем, после 10000 обновлений / вставок / удалений lucene, чтобы быстро обновлять индексы lucene.

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

Решение № 2:

  1. Отправлять асинхронные сообщения для каждого обновления, связанного с lucene.
  2. Обработайте эти сообщения и обновляйте lucene каждый раз, когда приходит сообщение
  3. Асинхронная обработка очень важна, иначе это может повлиять на производительность приложения.

Я бы пошел с # 1, потому что это должно быть дешевле для сервера.

Выберите то, что вам больше нравится.

0 голосов
/ 23 февраля 2012

Идите прямо к MongoDB или базе данных и увеличивайте и уменьшайте голоса. Вы должны постоянно обновлять базу данных, на мой взгляд. Не нужно усложнять. Что-то добавлено, что-то добавить в базу данных. обновлять, вставлять, удалять все время, если есть изменения на веб-сайте. Необходимо отслеживать изменения, а место отслеживания находится в базе данных mongodb или sql. Для поиска полей используйте параметры поиска поля mongodb и объедините все поля, которые он возвратил, и оцените их самостоятельно.

...