Ищу готовое сервис для работы с постоянно пополняющейся базой данных.
Необходимо создать базу данных, куда ежедневно будет добавлятся ~15k (дальше еще больше)
Планируется два сценария работы с базой:
1. Добавление новых записей: если строка в базе не существует, то добавить её в базу.
2. Поиск по базе данных:
- поиск по текстовым полям по заданым ключевым словам/фразам на разных языках (с учетом морфологии)
- поиск по числовым полям
- сортировка по дате добавления
Вот примерная структура сущности:
- заголовок (текстовое поле)
- описание (текстовое поле)
- кол-во на складе (число)
- кол-во в магазине (число)
- категории (масив числовых значний, id категорий)
Если описать запрос словами, получится примерно так:
Получить все записи, для которых выполняется условия:
1. В заголовке или описании содержатся слова apple, orange
2. В заголовке или описании НЕ содерится banana
3. Если есть на складе и кол-во > 10 или кол-во в магазине > 1
5. В категориях ID:10, ID: 20, ID:30
Что бы ускорить поиск, записи можно фильтров по дате добавление, и не учитывать те, которые были добавлены больше 72 часов назад.
Думал разрабатывать, например на MySQL + Sphinx, или Elasticsearch, но это долго и дорого, к тому же нужно постоянно поддерживать.
Смотрел в сторону готовых решений и SaaS сервисов. Пробовал Elastic App Search, все было хорошо, но столкнулся с ограниченим 2 проблемами:
1. если ключевые фразы на разных языках, морфология не работает.
2. есть ограничение в 128 символов в поисковом запросе. На форуме подсказали, что таких долгих поисковых запросов впринцыпе не должно быть, и я не для того использую сервис.
Неужели нет готовых решений, что бы создать сущность, задать поля и по API добавлять записи и делать по ним поиск?
Позвольте узнать, насколько большие запросы Вы собираетесь делать, что 128 символов мало?
Насколько большая база изначально?
Если вам нужен поиск по БД для собственных нужд, был подобный опыт - дешево и сердито:
БД на 1.7 миллиона записей со средней длинной Заголовка ~300 символов и Списка ~20000 символов, дополнительно поля - Статус, Номер, Дата создания
MySQL на хостинге отрабатывал LIKE запросы достаточно быстро. И мог бы еще быстрее при добавлении FULLTEXT индекса.
Про морфологию можно позаботиться делая запросы не по целым словам - appl, orang, banan. Так же на других языках.
Логику умного поиска можно бесконечно развивать под свои нужды, сам по себе он умным не будет.
Символов так много, потому что поиск может быть по 10 ключевым фразам, если еще добавить операторы AND, OR, NOT и 128 символов становится мало.
Уже есть тестовая база, на 10 млн. записей, настроены индексы, подключен sphinx, но изначально все было настроено криво, ищет не всегда корректно, и нагружает сервер.
Василий Г., база действительно большая. Согласен с Antonio Solo - Сфинкс в Вашем случае правильное направление.
Жесткого ограничения в Сфинксе на 128 символов нету, это скорее рекомендация.
Используем на production Sphinx 3.1.1 для одной из БД на 3.5 млн записей с полными текстами документов.
Рекомендую шаманить с опциями morphology, blend_chars, blend_mode, charset_table - они оказывают существенное влияние на качество поиска.
Указатель (подобный книжному) диапазонов id/строк записей по каждому из языков и по каждому уникальному термину из всех строк для каждого из языков.
При изменении базы - всегда обновляете указатель.
Порядок условий при поиске из вашего примера (из 5 пунктов) - правильный. Это корректный "водопадный" фильтр выборки.
Неужели нет готовых решений, что бы создать сущность, задать поля и по API добавлять записи и делать по ним поиск?
конечно же есть, но не в открытом доступе и не бесплатно.
По поводу "бесплатно" - не ищу такой, как раз наоборот, готов расмотреть любое облачное решение или продукт, с подобным функционалом.
Смотрел на сервисы Elastic, Google Cloud, AWS - есть подобные решения, но немного не то что я искал.