Лучшие технологии для поиска в базе данных через regex?

У меня есть база данных из миллиона документов с текстом, в которых дана информация о судебных решениях. В них даны имена, типы судебных исков и тд.

Мне нужно создать веб сервис, в котором пользователь сможет искать по базе данных по заданным таким данным/параметрам из этих судебных решений, то есть идет чистая работа с текстом (я так понимаю надо взять sphinx или ElasticSearch). Но мне нужно не просто поиск фразы по тексту, а делать сложный поиск типа regex.
Например, пользователь на сайте будет писать в поле "Найти судью:" судью "Иванова".
Тогда поиск будет типа "/Судья на заседании: (.*?)/s", где $1 = "Иванова".

Вопрос:
1) в какой базе данных (postgresql, mongodb, redis и тд..) лучше мне это хранить в вебе и на каком языке создать такой сервис (php, ruby, python и тд..), чтобы быстро все работало при большой выборке? Какими методами и технологиями можно сделать такой поиск по миллиону документов?
2) если невозможно сделать такой regexp поиск, будет ли быстро работать поиск, если искать 1 млн. сразу, а потом к каждому документу выдачи уже не на sql, а на backend'e применять фильтр на regexp (то есть отображать этот документ по Ивановой судьи или нет)?
  • Вопрос задан
  • 969 просмотров
Пригласить эксперта
Ответы на вопрос 6
Melkij
@Melkij
PostgreSQL DBA
1) никакой, это всё равно full scan не самым дешёвым конечным автоматом.
2) нет, не будет

Быстро будет работать, если вы предварительно распарсите и нормализуете индекс документов.
Надо искать судью? Распарсите свои документы, получите список связей, в каких документах какие судьи участвуют. И так с остальными данными, по которым надо искать.
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
sphinxsearch
Postgres
асинхронный Питон (aiohttp)
Ответ написан
Комментировать
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Я так думаю, что как раз ES здесь очень даже к месту. Тем более, что поиск будет осуществляться по термам слов, и можно будет искать не только "Судья на заседании: Иванова", но и "Судьи в председательстве Ивановой", "судью Иванову" и прочее.

Попробуйте, ES имеет особенности, но не так уж и страшен.

PS. Уж как минимум, ES позволит сократить список рассматриваемых документов до разумного минимума, по которому можно и программный regexp сделать.
Т.е. сначала выбираем из ES все доки с судьями, заседаниями и Ивановой, а уже по результатам поиска делаем фильтрацию своим программным регекспом.
Ах, да, совсем забыл - есть еще скрипты, которые могут как раз это и сделать на стороне самого ES! Ну и люсиновский поиск поддерживает "точный поиск" фраз, если чо..
Ответ написан
@asd111
Берите Elastic. Там есть нечеткий поиск( Иавнов вместо Иванов), фасетный поиск(поиск по аттрибутам документа например фамилия судьи), поиск по регуляркам(т.е. вам не нужно будет обрабатывать результат поиска - нужно будет в поисковый запрос дописать то что вы хотели делать регуляркой самостоятельно), поиск по синонимам(в поисковой строке написали автомобиль а в тексте написано машина) и т.д и т.п.
Технология поиска, которую вы описываете называется полнотекстовый поиск. На миллионах документов работает быстро - именно её реализовывают elastic, sphinx и похожие программы. Эти программы используются на многих сайтах для поиска по большим объёмам имеющихся данных- на том же stackoverflow, instagram и т.п.
Бд можно взять postgres, т.к. там хорошо работает шардинг и репликация.
Язык можно взять тот который вы лучше знаете. Главное сервер брать помощнее, т.к. основную работу будет делать поисковая система. Говорят что новый php 7 кушает в два раза меньше оперативной памяти чем раньше, но на мой взгляд php фреймворки очень сильно уступают тому же python Django в плане удобства использования и долгосрочной поддержки уже написанного кода.
Ответ написан
Комментировать
@taaadm
Быть может вам стоит сначала перевести все эти файлы в БД и уже с ней работать. Т.е сначала распарсить все файлы по возможным параметрам, их сохранить в БД. В базе создать индексы и к базе писать web сервис
Ответ написан
Комментировать
Я бы использовал Sphinx, позволяет очень тонко настроить поиск. Он создан как раз для таких задач. Конечно нужны знания или специалист. Язык большой роли не играет, я знаю php, сделал бы на нем. Дальше уже советовать нет смысла, нужно знать что вам конкретно надо, какие данные, сколько, обновляются ли они, как часто добавляются и т.д.

Забыл про базу. Опять же на ваш выбор, я бы выбрал MySql. Но есть вариант без базы, когда у вас есть текстовые файлы и Sphinx на прямую их индексирует. не знаю на сколько такой вариант вам походит.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы