Лучший способ хранить большие текстовые файлы с возможностью поиска

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

Имея это в виду, я собираюсь ожидать, что в конечном итоге у меня будет умеренный поток запросов, проходящих через программу. Так же для тех, кто не знаком с Библией, в ней есть 2 метода форматирования текста. Он может содержать как красный текст, так и курсив. Мне нужен способ хранить Священные Писания вместе с красными буквами и курсивом, но позволяющий поисковым запросам игнорировать форматирование.

Он также должен быть быстрым и максимально эффективным (использование памяти и процессора). Будет рассмотрен любой формат хранения (текстовые файлы MySQL, JSON или XML и т. д.), если запросы могут выполняться без учета форматирования. Размер и количество файлов на самом деле не имеют значения, поэтому разделение книг или даже глав на отдельные файлы меня устраивает.

Еще одна важная вещь, о которой следует помнить, это то, что я хочу иметь какой-то метод поиска, который может выполнять поиск по нескольким стихам. Таким образом, поиск «иметь жизнь вечную, ибо Бог не послал Своего Сына» вернет Иоанна 3:16,17. Спасибо за все идеи!


person Patrick Stephan    schedule 17.09.2011    source источник
comment
вы можете искать очень быстро, используя grep. какую платформу вы планируете использовать?   -  person galchen    schedule 18.09.2011


Ответы (2)


Существует множество различных систем поиска документов с открытым исходным кодом, которые созданы именно для того, что вы пытаетесь сделать. Solr, Elastic Search, Xapian, Whoosh, Haystack (сделано для Django) и другие. Есть и другие посты на S.O. и в других местах, которые касаются преимуществ использования одного по сравнению с другим, но ваши требования достаточно просты, чтобы любое из них было более чем хорошим (и легко масштабируется с минимальными усилиями, если ваш проект взлетит, что всегда приятно знать). Так что посмотрите на их примеры и посмотрите, какой из них кажется вам наиболее интуитивным. Solr, пожалуй, самый популярный и единственный, с которым я работал, но Elastic Search использует тот же популярный бэкенд Lucene, и, по-видимому, его гораздо проще настроить и использовать. работает, так что я бы начал там.

Что касается фактической реализации, вы захотите проиндексировать каждый стих как отдельный «документ», если вы хотите вернуть один стих (или просто номер стиха). Поисковая система ранжирует результаты на основе релевантности (обычно с использованием алгоритма tf/idf, если вам это интересно).

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

Предостережение: если вы не знакомы с поисковым индексированием, даже что-то вроде Elastic Search, разработанное как plug-and-play, вероятно, все равно потребует некоторого времени и усилий для настройки, поэтому, если вам абсолютно нужно чтобы быстро все это запустить и запустить, и вы уже знакомы с MySQL, я полагаю, что это может сработать (он выполняет полнотекстовый поиск). Но это, безусловно, не лучший инструмент для работы, поэтому, если это проект, в который вы инвестировали, вы поблагодарите себя позже, если немного потрудитесь, чтобы изучить одну из этих поисковых платформ. Это может быть излишним с точки зрения количества текста, с которым вы имеете дело, как указывали другие, но он будет чрезвычайно гибким в том, как вы можете искать этот текст, который кажется вам тем, что вы хотите. Например, добавление других требований позже было бы очень простым (например, вы могли бы разрешить людям ограничивать свой поиск только совпадениями в красном тексте).

person danny    schedule 18.09.2011
comment
Спасибо за ответ. это все еще лучший подход к ответу в 2020 году? - person Crashalot; 10.08.2020

Я не знал, что в Библии есть форматирование. Для чего это используется? Если речь идет о стихах, я бы посоветовал вам хранить каждый стих в базе данных. В сильно нормализованном виде вы получили таблицу с книгами, таблицу с главами и таблицу со стихами. Каждый стих состоит из номера стиха и текста стиха.

Теперь, я думаю, у глав нет заголовков, так что они на самом деле просто номер. В таком случае глупо хранить их отдельно, поэтому у вас есть только ваша таблица книг и таблица стихов, в которой у каждого стиха есть номер главы, номер стиха и текст стиха. Этот текст я считаю простым текстом, не так ли?

Если стих представляет собой обычный текст, вы можете легко сделать его доступным для поиска, сохранив его в MySQL и создав для него индекс FULLTEXT. Таким образом, вы можете выполнять поиск достаточно эффективно и даже использовать подстановочные знаки и тому подобное.

Если стих должен был иметь форматирование, вы могли бы создать два столбца, один с обычным текстом для поиска и один с форматированным текстом для отображения, но я сомневаюсь, что вам это понадобится.

PS: 5 МБ текста - это вообще ничего. Если у вас есть специальная программа, вы можете сохранить ее в памяти в виде одной строки и использовать strpos или аналогичную функцию для поиска текста. Какой язык, базу данных и платформу вы используете?

person GolezTrol    schedule 18.09.2011
comment
Я использую сервер LAMP. Я программирую на PHP, и MySQL будет лучшей базой данных для использования. Ваша идея хранить текстовую версию и отформатированную версию отлично сработает. Я никогда не думал сделать это. Форматирование, о котором я говорю, — это слова Христа, выделенные красным, и слова, выделенные курсивом в Версии Короля Иакова. - person Patrick Stephan; 18.09.2011