Задать вопрос
  • Какую систему можно использовать для поиска запроса среди текста?

    @humoured
    Вы всё на свете найдёте в коробке с карандашами
    Какие изыскания вами уже были предприняты?
    Начните с ElasticSearch, она отлично съест десятки гигабайт данных.

    Важным критерием должно быть получение результатов не дольше 1 секунды.
    Важным критерием станет сложность условий поиска и стоимость оборудования, арендованного для работы вашей системы.
    Ответ написан
    2 комментария
  • Какую систему можно использовать для поиска запроса среди текста?

    @rPman
    Для ответа на твой вопрос нужно знать, какие именно запросы ты собираешься делать.

    На каждый запрос необходимо создать индекс, некий массив данных, который позволит очень быстро (обычно с трудоемкостью log от количества данных) найти записи, соответствующие связанному с ним запросу (обычно это буквально значение -> список ссылок на записи, часто в виде сложной структуры, например древовидной). Запросы ведь бывают разные, есть простые - просто поиск по значению, математические (суммы, поиск min/max, и т.п.) и текстовые (например наличие слова в подстроке), и на каждый тип может понадобиться свой индекс.

    Индексы можно создавать самостоятельно в оперативной памяти средствами языка (например c++, java,.. имеют готовые классы для индексации типа has table или has tree или еще как). Настоятельно рекомендую взять готовый софт - реляционные базы данных, позволяющих очень красиво описать свои данные в виде реляционной структуры, настроить индексы и, пользуясь sql запросами, делать эффективные поисковые запросы.

    Открытые и бесплатные mysql, postgres, sqlite (последний очень простой, в виде библиотеки а не сервера а база в виде файла). В подавляющем большинстве случаев открытые и бесплатные инструменты будут более чем достаточны и не будут отличаться по скорости с дорогими платными инструментами, чаще всего они дают прирост в сложных ситуациях, когда есть многопользовательский доступ с одновременной записью, инструменты отказоустойчивости и т.п. в общем все то что в данной задаче скорее всего не нужно.

    Недостаток - sql базы данных добавляют накладные расходы на запись данных, чтобы обеспечить надежную запись данных и исключить потерю данных, к примеру после сбоя, и делает они это с помощью транзакций. Можно (нужно) конечно заворачивать записи в базу в пакеты (по несколько тысяч записей на транзакцию, так как базы данных не любят незавершенные транзакции размером на все 90гб), в любом случае первоначальное наполнение может затянуться. Так же настоятельно рекомендуется добавлять индексы после того как данные добавлены в базу, а не до этого, так как на каждую запись будет пересчитываться индекс а это очень медленно.

    Есть лайфхак, средствами файловой системы включаешь принудительное кеширование записи, т.е. игнорирование команды flush от сервера базы данных.. делать это можно разными способами, тюнинг файловой системы (ext4 journal date write back), виртуальные машины с принудительным кешированием, инструменты самой базы данных (например разместить файл лога т файлы хранения индексов в оперативной памяти) и т.п.
    Ответ написан