Существуют ли какие-либо инструменты с открытым исходным кодом или коммерческие инструменты, которые позволяют индексировать фрагменты текста содержимого базы данных и могут быть запрошены из Java?
История вопроса - большая таблица базы данных MySQL с несколькими сотнями тысяч записей, содержащих несколько столбцов VARCHAR. В этих столбцах люди хотели бы искать фрагменты содержимого, поэтому полнотекстовый индекс (который основан на границах слов) не помог бы.
РЕДАКТИРОВАТЬ : [Добавлено, чтобы прояснить, почему эти первые предложения не решат проблему:]
Вот почему встроенный в MySQL полнотекстовый индекс не справится с работой, равно как и Lucene или Sphinx, и все они были предложены в ответах. Я уже рассматривал оба из них, но, насколько я могу судить, они основаны на индексации слов , исключая стоп-слова и делая все возможное для реального полнотекстового поиска. Однако это не подходит, потому что я мог бы искать поисковый термин, такой как «oison», который должен соответствовать «Roisonic Street», а также «Poison-Ivy». Ключевым отличием здесь является то, что поисковый термин - это просто фрагмент содержимого столбца , который не должен быть ограничен какими-либо специальными символами или пробелами.
EDIT2 : [Добавлена дополнительная справочная информация:]
Запрашиваемая функция, которая должна быть реализована на основе этого, является очень свободным поиском описаний товаров в системе управления товарами. Пользователи часто не знают правильный номер элемента, а только часть названия элемента. К сожалению, качество этих описаний довольно низкое, они происходят из устаревшей системы и не могут быть легко изменены. Если, например, люди искали кувалду, они входили в «сани». С индексом на основе слова / токена это не будет находить совпадения, которые хранятся как «кувалда», а только те, которые слушают «кувалду». Есть все виды странных отклонений, которые должны быть покрыты, делая подход на основе токенов нецелесообразным.
В настоящее время единственное, что мы можем сделать, - это запрос LIKE '%searchterm%'
, эффективно отключающий любое использование индекса и требующий большого количества ресурсов и времени.
В идеале любой такой инструмент должен был бы создать индекс, который позволял бы мне очень быстро получать результаты для подобных запросов, поэтому я мог бы осуществлять поиск, похожий на прожектор, только извлекая "реальные" данные из таблицы MySQL через первичный ключ, когда пользователь выбирает запись результата.
Если возможно, индекс должен быть обновляемым (без необходимости полного перестроения), поскольку данные могут измениться и должны быть доступны для поиска немедленно другими клиентами.
Я был бы рад получить рекомендации и / или отчеты об опыте.
EDIT3: Коммерческое решение показало, что "просто работает"
Несмотря на то, что я получил много хороших ответов на этот вопрос, я хотел отметить здесь, что в итоге мы пошли с коммерческим продуктом под названием «QuickFind», изготовленным и проданным немецкой компанией под названием «HMB Datentechnik». Обратите внимание, что я не связан с ними каким-либо образом, потому что это может выглядеть так, когда я продолжаю и описываю, что может делать их продукт. К сожалению, их веб-сайт выглядит довольно плохо и только на немецком языке, но сам продукт действительно великолепен. В настоящее время у меня есть пробная версия от них - вам придется связаться с ними, без загрузки - и я очень впечатлен.
Поскольку в Интернете нет исчерпывающей документации, я пока попытаюсь описать свой опыт.
Они создают собственный индексный файл на основе содержимого базы данных. Они могут интегрироваться через ODBC, но, как мне сказали, клиенты редко делают это. Вместо этого - и это то, что мы, вероятно, будем делать - вы генерируете текстовый экспорт (например, CSV) из своей основной базы данных и передаете его в свой индексатор. Это позволяет вам быть полностью независимым от фактической структуры таблицы (или вообще от любой базы данных SQL); фактически мы экспортируем данные, объединенные из нескольких таблиц. Индексы могут постепенно обновляться позже на лету.
Исходя из того, что их сервер (всего 250 КБ или более, работающий как консольное приложение или служба Windows) обслуживает запросы на порт TCP. Протокол основан на тексте и выглядит немного «старым», но он прост и работает. В основном вы просто передаете, какой из доступных индексов вы хотите запросить, а также условия поиска (фрагменты), разделенные пробелом.
Доступны три формата вывода: массив HTML / JavaScript, XML или CSV. В настоящее время я работаю над оболочкой Java для несколько устаревшего проводного протокола. Но результаты потрясающие: в настоящее время у меня есть примерный набор данных приблизительно из 500 000 записей с индексированными 8 столбцами, и мое тестовое приложение запускает поиск по всем 8 столбцам содержимого JTextField при каждом нажатии клавиши во время редактирования. и может обновлять отображение результатов (JTable) в режиме реального времени! Это происходит без обращения к экземпляру MySQL, откуда изначально были получены данные. Основываясь на возвращаемых вами столбцах, вы можете запросить «оригинальную» запись, запросив MySQL с первичным ключом этой строки (конечно, должен быть включен в индекс QuickFind).
Индекс составляет около 30-40% размера текстовой версии экспорта данных. Индексирование в основном зависело от скорости дискового ввода-вывода; мои 500.000 записей заняли около минуты или двух для обработки.
Трудно описать это, поскольку мне было даже трудно поверить, когда я увидел демо-версию собственного продукта. Они представили базу данных с адресами в 10 миллионов строк и искали фрагменты имен, адресов и телефонных номеров, и при нажатии кнопки «Поиск» результаты возвращались менее чем за секунду - и все это делалось на ноутбуке! Из того, что мне сказали, они часто интегрируются с системами SAP или CRM для улучшения времени поиска, когда агенты колл-центра просто понимают фрагменты имен или адресов вызывающего абонента.
Так или иначе, я, вероятно, не стану намного лучше описывать это. Если вам нужно что-то подобное, вам обязательно нужно проверить это. Переводчик Google довольно неплохо переводит свой сайт с немецкого на английский, так что это может быть хорошим началом.