Хотя тема совсем не о паскале, но народу на форуме умного достаточно много. Мне уже предложили для постгреса: 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 символа).
зы
если чо я искать по таким большим таблицам в БД ваще не умею, любой совет мне может помочь.