Как правильно сделать поиск?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Как правильно сделать поиск?

Сообщение azsx » 30.07.2016 19:31:12

Хотя тема совсем не о паскале, но народу на форуме умного достаточно много. Мне уже предложили для постгреса: 1. воспользоваться триграмным индексом. К стыду, я его пока запустить не смог. 2. Какой то жутко замудренный способ, с каким то матаном. Пока я ваще его не понял. зы мне бы чо попроще.
есть 2 таблицы:
1. уникальные тексты анкоров. Около 2,5 млн записей, 180 мб. Поиск по ней, например, ilike '%webimho%' занимает 6 секунд.
2. уникальные тексты главных. Около 5,06 записей, 67,5 гб. Поиск по ней, например, ilike '%webimho%' занимает 2,5 часа. зы греп в тхт за 15 минут нашел бы.
Я хочу сделать быстрый поиск точного и не точного вхождения (неточное в перспективе). Полнотекстовый поиск постгрес мне не подходит, так как надо указывать язык, а я их не знаю.
Допустим вторая таблица. Что я думаю сделать. Разбить текст по словам и мета тегам, перевести в нижний регистр. Разбить полученные слова по шинглам, например с размерностью 3. Создать на основе этих шинглов таблицу с полями 1. shingl3 сам шингл (создам индекс); 2. svyaz номер связи для уникальной странице главной.
Допустим мне надо найти webimho. Я разбиваю слово по шиглам и сокращаю повторы (если есть). Даю запрос, типа
select discint(svyaz) from tabl_shingl3 where
shingl3 = 'web' AND shingl3 = 'ebi' AND shingl3 = 'bim' AND shingl3 = imh' AND shingl3 = 'mho';
Полученные id записей второй таблицы 67,5 гб я буду искать уже like или ilike в зависимости от того надо соблюдать регистр или нет. Если скорость поиска на второй таблице устроит - спроецирую решение на первую.
select unik_glavnaya from tabl_unik_glavnaya where text_glavnaya ilike '%webimho%';
Вопросы:
1. Чо я делаю не так?
2. Как можно сделать совсем по другому и намного лучше?
3. Как сохранять данные в таблице шинглов?
Способ А.
шингл (3 чар) | unik_glavnaya (bigserial)
web 100
hfg 200
imh 100
imh 200
---
Способ Б
шингл (3 чар) | unik_glavnaya (text)
web '100'
hfg '200'
imh '100|200'
---
Таким образом при первом способе я буду делать выборку и сразу получать уникальные id в числовом формате. Тем не менее дублирование полнейшее, будет очень много записей.
Способом Б я смогу получать только число записей сколько у меня шинглов (нет дубликатов). Зато потом мне надо программно разобрать строки text, удалить дубликаты, преобразовать строки в число. Можно без преобразований, но тогда надо использовать уникальынм текстом главной не bigserial, а md5 сумму (сразу строковый формат фиксированный 32 символа).
зы
если чо я искать по таким большим таблицам в БД ваще не умею, любой совет мне может помочь.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Как правильно сделать поиск?

Сообщение Ism » 02.08.2016 00:56:33

Делаешь поле search и скидываешь туда слова отрезая спереди одну букву и так пока не останется 4, поле сделать fulltext индекс, запрос выполнять в boolean режиме (mysql) этим можно добиться быстрого поиска анологичного like

Версия mysql не ниже 5.6
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Как правильно сделать поиск?

Сообщение azsx » 02.08.2016 07:25:54

извините, не отметил, что у меня postgres 9.5. В mysql под мою задачу полнотекстовый поиск реализован более правильно (без учета морфологии). А в постгрес надо именно язык указывать, которого я не знаю.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Как правильно сделать поиск?

Сообщение azsx » 29.08.2016 12:05:41

Сделал поиск по триграммам. Плюсы - абы как оно работает. Минусы - совсем никак не работают utf8. Вот гадаю теперь что и как переделать, чтобы всё стало работать хорошо.
Ни у кого мыслей нет?
Напомню условия, 12 млн документов, надо сделать поиск по точному вхождению (то есть, например ilike '%<a>href="http://bebebe%'; или :) '%UA-3209617%'), чем быстрее - тем круче.
Щас всё работает - но крайне медленно и не уверен я...
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Как правильно сделать поиск?

Сообщение WAYFARER » 29.08.2016 12:34:13

azsx писал(а):чем быстрее - тем круче.

Я бы рекомендовал взглянуть в сторону Sphinx
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 517
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Как правильно сделать поиск?

Сообщение azsx » 29.08.2016 13:02:33

Как я понимаю он мне не подойдет совсем. Ему надо указывать язык поиска и он силен именно на поиске морфологий. У меня же желание сделать поиск точного вхождения вместе с спецсимволами минимум (accii 33 - 254), а лучше по всем кодировкам.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru