Могу ли я использовать Lucene для поиска бизнес-приложений? - PullRequest
2 голосов
/ 13 сентября 2009

У меня есть типичное корпоративное / бизнес-приложение, которое я разрабатываю и которое включает в себя заказы, продавцов, контакты, справочные данные и т. Д. В системе будет одновременно не менее 100 или более пользователей, которые вводят новые данные изменение данных и т. д. Мне нужно обеспечить возможность поиска по всему приложению практически для всех таблиц.

Одним из вариантов является выполнение табличных запросов, таких как «выбор * из продавцов, где имя содержит« поиск »» или что-то подобное. Но мне было интересно, могу ли я вместо этого использовать Lucene (.net) для этого.

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

Это что-то, что будет хорошо работать, или есть лучший вариант?

Ответы [ 2 ]

4 голосов
/ 13 сентября 2009

Да, вы, безусловно, можете использовать Lucene для этого варианта использования. Я вижу некоторые недостатки:

  • Вы будете реплицировать большую часть информации в индексе (и у вас будет возможность реализовать что-то для синхронизации индекса и базы данных, что может быть нетривиальным.)
  • Для создания этого индекса вы будете очень часто обращаться к базе данных (или будете откладывать вставки или просто создавать дополнительную нагрузку, в зависимости от того, как вы ее создадите).
  • Поиск в режиме реального времени реализован только в последней версии официального Lucene . Я не знаю о статусе Lucene.net в этом отношении.

И (большой) потенциал роста:

  • Lucene, скорее всего, превзойдет как по производительности, так и по качеству результатов полнотекстовую индексацию базы данных.

Ответы на этот вопрос могут помочь Лучшая практика Lucene.Net

2 голосов
/ 13 сентября 2009

Я реализовал нечто почти идентичное тому, что вы описываете. Таблица для индексации была огромной (> 5 часов для индексации с lucene), и требовалось, чтобы поиск отражал изменения в БД в течение 5 минут. Я рассмотрел два подхода (я реализовал первый):

  • Индексировать таблицу постепенно. У каждой строки была временная метка (последняя модификация). Каждые 5 минут задание cron запускает процесс Java, который читает строки, измененные с момента последнего запуска, создает их текстовую версию и затем обновляет индекс lucene. Инкрементная индексация заблокирует таблицу на 200-300 мсек для примерно 1000 строк таблицы. Очевидно, что это зависит от вашей системы, схемы базы данных и т. Д. Однако мой опыт показывает, что это практично реализовать. И поисковые операции на порядки быстрее с lucene, чем с запросом.

  • Используйте выделенный поток для индексации. Всякий раз, когда что-то изменяется в БД, код, который фактически выполняет запрос SQL, должен отправить сообщение (через LinkedBlockinQueue) потоку, который обновляет индекс lucene. Таким образом, ваш метод updateDB () в главном потоке возвращается сразу после обновления БД, и ему не нужно ждать процесса индексации lucene, в то время как индексация происходит как можно скорее (обычно через несколько месяцев). Недостатком этого является то, что Lucene использует блокировки, хранящиеся на диске. Таким образом, я предполагаю, что накладные расходы обновляются для каждой отдельной строки (хотя я не проводил никаких тестов). Обходной путь может заключаться в том, чтобы хранить буфер обновлений в потоке индексации и сбрасывать их на диск каждые несколько секунд (опять же, производительность зависит от соотношения обновлений и поисков по индексу)

...