Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как правильно сделать поиск? / 16 сообщений из 16, страница 1 из 1
28.07.2016, 06:43
    #39281603
azsx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
есть 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 символа).
зы
если чо я искать по таким большим таблицам в БД ваще не умею, любой совет мне может помочь.
...
Рейтинг: 0 / 0
28.07.2016, 09:27
    #39281657
Alexius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
azsx,

возможно будет достаточно обычного триграмного индекса (см. https://www.postgresql.org/docs/9.5/static/pgtrgm.html )
...
Рейтинг: 0 / 0
28.07.2016, 12:13
    #39281786
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
автор" Полнотекстовый поиск постгрес мне не подходит, так как надо указывать язык, а я их не знаю."

В FTS поиске нет такой возможности, чтобы язык не указывать?
Чтобы парсер тупо разбирал текст по разделителям слов, формы естественно не будут учитываться, но индексироваться будет и искать будет?

Скажем для текстов, в которых может быть несколько языков исопльзовано
...
Рейтинг: 0 / 0
28.07.2016, 13:27
    #39281868
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
Ролг Хупинавтор" Полнотекстовый поиск постгрес мне не подходит, так как надо указывать язык, а я их не знаю."

В FTS поиске нет такой возможности, чтобы язык не указывать?
Чтобы парсер тупо разбирал текст по разделителям слов, формы естественно не будут учитываться, но индексироваться будет и искать будет?

Скажем для текстов, в которых может быть несколько языков исопльзовано

тогда это уже не FTS будет а like '% sometext %' и решается через триграмные индексы.

PS: не во всех языках пробелы являются разделителями слов (и вообще понятие разделителя слов в общем случае зависит от языка).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
28.07.2016, 13:30
    #39281869
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
Ролг Хупинавтор" Полнотекстовый поиск постгрес мне не подходит, так как надо указывать язык, а я их не знаю."

В FTS поиске нет такой возможности, чтобы язык не указывать?
Чтобы парсер тупо разбирал текст по разделителям слов, формы естественно не будут учитываться, но индексироваться будет и искать будет?

Скажем для текстов, в которых может быть несколько языков исопльзовано

"vous êtes stupide, est-ce pas? you're stupid, isn't it?" Ну и как делить будем?
...
Рейтинг: 0 / 0
28.07.2016, 13:37
    #39281878
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
dimonz80Ролг Хупинпропущено...


В FTS поиске нет такой возможности, чтобы язык не указывать?
Чтобы парсер тупо разбирал текст по разделителям слов, формы естественно не будут учитываться, но индексироваться будет и искать будет?

Скажем для текстов, в которых может быть несколько языков исопльзовано

"vous êtes stupide, est-ce pas? you're stupid, isn't it?" Ну и как делить будем?

это еще ничего... вы добавьте арабский тайский и китайский туда до кучи еще :)

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
28.07.2016, 18:23
    #39282141
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
Maxim BogukРолг Хупинпропущено...


В FTS поиске нет такой возможности, чтобы язык не указывать?
Чтобы парсер тупо разбирал текст по разделителям слов, формы естественно не будут учитываться, но индексироваться будет и искать будет?

Скажем для текстов, в которых может быть несколько языков исопльзовано

тогда это уже не FTS будет а like '% sometext %' и решается через триграмные индексы.

PS: не во всех языках пробелы являются разделителями слов (и вообще понятие разделителя слов в общем случае зависит от языка).

--
Maxim Boguk
www.postgresql-consulting.ru

Не очень понятно, а если в тексте скажем гна русском встречаюются цитаты на английском и немецком?

Ну SQL Server FTS нормально живет себе с нейтральным языком и с набором стандартных разделителей.
...
Рейтинг: 0 / 0
28.07.2016, 19:31
    #39282194
Oleg Bartunov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
Ролг Хупин,

в src/test/modules/test_parser есть тестовый парсер, который по пробелам фигачит. FTS поддерживает кастом парсеры, словари, так что никто не мешает вам сварганить свой парсер и искать как хочешь. Более того, никто не мешает написать словарь, который генерит триграммы, если что. Я как-то написал словарь folded_string, который берет слово и складывает его посередине, что позволяет искать с помощью gin %text%. Не знаю, как все это поможет, но пищу для размышлений даст :)
...
Рейтинг: 0 / 0
28.07.2016, 20:02
    #39282210
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
Ролг ХупинMaxim Bogukпропущено...


тогда это уже не FTS будет а like '% sometext %' и решается через триграмные индексы.

PS: не во всех языках пробелы являются разделителями слов (и вообще понятие разделителя слов в общем случае зависит от языка).

--
Maxim Boguk
www.postgresql-consulting.ru

Не очень понятно, а если в тексте скажем гна русском встречаюются цитаты на английском и немецком?

Ну SQL Server FTS нормально живет себе с нейтральным языком и с набором стандартных разделителей.

а каким образом like '% sometext %' зависит от наличия или отсутствия цитат на английском в тексте?

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
29.07.2016, 12:59
    #39282678
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
Maxim BogukРолг Хупинпропущено...


Не очень понятно, а если в тексте скажем гна русском встречаюются цитаты на английском и немецком?

Ну SQL Server FTS нормально живет себе с нейтральным языком и с набором стандартных разделителей.

а каким образом like '% sometext %' зависит от наличия или отсутствия цитат на английском в тексте?

--
Maxim Boguk
www.postgresql-consulting.ru

Не зависит, но вообще-то like будет долго искать в тексте, индексы не используются.
Если не прав - исправьте
...
Рейтинг: 0 / 0
29.07.2016, 13:01
    #39282680
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
dimonz80Ролг Хупинпропущено...


В FTS поиске нет такой возможности, чтобы язык не указывать?
Чтобы парсер тупо разбирал текст по разделителям слов, формы естественно не будут учитываться, но индексироваться будет и искать будет?

Скажем для текстов, в которых может быть несколько языков исопльзовано

"vous êtes stupide, est-ce pas? you're stupid, isn't it?" Ну и как делить будем?

пробелы, знаки

vous
êtes
stupide
est-ce
pas
you're
stupid
isn't
it
...
Рейтинг: 0 / 0
29.07.2016, 13:04
    #39282685
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
Ролг ХупинMaxim Bogukпропущено...


а каким образом like '% sometext %' зависит от наличия или отсутствия цитат на английском в тексте?

--
Maxim Boguk
www.postgresql-consulting.ru

Не зависит, но вообще-то like будет долго искать в тексте, индексы не используются.
Если не прав - исправьте

как я уже выше написал: "и решается через триграмные индексы"
https://www.postgresql.org/docs/9.5/static/pgtrgm.html

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
30.07.2016, 04:44
    #39283213
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
Ролг Хупинdimonz80пропущено...


"vous êtes stupide, est-ce pas? you're stupid, isn't it?" Ну и как делить будем?

пробелы, знаки

vous
êtes
stupide
est-ce
pas
you're
stupid
isn't
it

да? и че эт за слова такие est-ce , you're , isn't ?)))
...
Рейтинг: 0 / 0
30.07.2016, 12:03
    #39283254
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
dimonz80Ролг Хупинпропущено...


пробелы, знаки

vous
êtes
stupide
est-ce
pas
you're
stupid
isn't
it

да? и че эт за слова такие est-ce , you're , isn't ?)))

Можно и их разделить, это не принципиально.
Имелось в виду - аналог нейтрального языка в SQL Server.
Это простейший делитель на слова, никаких форм слов, и естественно допускаются такие случаи, когда неправильно с точки зрения какого-то языка.
...
Рейтинг: 0 / 0
30.07.2016, 13:20
    #39283262
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
Ролг Хупинdimonz80пропущено...


да? и че эт за слова такие est-ce , you're , isn't ?)))

Можно и их разделить, это не принципиально.
Имелось в виду - аналог нейтрального языка в SQL Server.
Это простейший делитель на слова, никаких форм слов, и естественно допускаются такие случаи, когда неправильно с точки зрения какого-то языка.

本システムで提供する法令データは、総務省行政管理局が官報を基に、施行期日を迎えた一部改正法令等を被改正法令へ溶け込ます等により整備を行い、データ内容の正確性については、万全を期しておりますが、官報で掲載された内容と異なる場合は、官報が優先します。
а так?
...
Рейтинг: 0 / 0
30.07.2016, 13:53
    #39283267
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск?
Ролг Хупин,



Я чего сказать-то хотел. Конечно можно порубить текст на куски пробелами ( или по 3 знака или еще как) и это иногда будет даже работать. Только ФТС без словаря и грамматического справочника, т.е. без информации о языке - это не ФТС. Морфология беспощадная ты с**а. Можно применить для нечеткого поиска всякие трюки: регулярки, саундексы, левенштейны, триграммы и т.п. Но это все будет проверкой на похожесть подряд идущих знаков, не более. Если ТСа это устроит то хорошо. Ему даже триграммы показали и сказали что по ним индекс можно строить. Но без инфы о языке свой яндекс не сделать, увы


Вот неплохо про нечеткий поиск .
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как правильно сделать поиск? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]