Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
есть 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 символа). зы если чо я искать по таким большим таблицам в БД ваще не умею, любой совет мне может помочь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 06:43 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
azsx, возможно будет достаточно обычного триграмного индекса (см. https://www.postgresql.org/docs/9.5/static/pgtrgm.html ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 09:27 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
автор" Полнотекстовый поиск постгрес мне не подходит, так как надо указывать язык, а я их не знаю." В FTS поиске нет такой возможности, чтобы язык не указывать? Чтобы парсер тупо разбирал текст по разделителям слов, формы естественно не будут учитываться, но индексироваться будет и искать будет? Скажем для текстов, в которых может быть несколько языков исопльзовано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 12:13 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупинавтор" Полнотекстовый поиск постгрес мне не подходит, так как надо указывать язык, а я их не знаю." В FTS поиске нет такой возможности, чтобы язык не указывать? Чтобы парсер тупо разбирал текст по разделителям слов, формы естественно не будут учитываться, но индексироваться будет и искать будет? Скажем для текстов, в которых может быть несколько языков исопльзовано тогда это уже не FTS будет а like '% sometext %' и решается через триграмные индексы. PS: не во всех языках пробелы являются разделителями слов (и вообще понятие разделителя слов в общем случае зависит от языка). -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 13:27 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупинавтор" Полнотекстовый поиск постгрес мне не подходит, так как надо указывать язык, а я их не знаю." В FTS поиске нет такой возможности, чтобы язык не указывать? Чтобы парсер тупо разбирал текст по разделителям слов, формы естественно не будут учитываться, но индексироваться будет и искать будет? Скажем для текстов, в которых может быть несколько языков исопльзовано "vous êtes stupide, est-ce pas? you're stupid, isn't it?" Ну и как делить будем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 13:30 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
dimonz80Ролг Хупинпропущено... В FTS поиске нет такой возможности, чтобы язык не указывать? Чтобы парсер тупо разбирал текст по разделителям слов, формы естественно не будут учитываться, но индексироваться будет и искать будет? Скажем для текстов, в которых может быть несколько языков исопльзовано "vous êtes stupide, est-ce pas? you're stupid, isn't it?" Ну и как делить будем? это еще ничего... вы добавьте арабский тайский и китайский туда до кучи еще :) -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 13:37 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
Maxim BogukРолг Хупинпропущено... В FTS поиске нет такой возможности, чтобы язык не указывать? Чтобы парсер тупо разбирал текст по разделителям слов, формы естественно не будут учитываться, но индексироваться будет и искать будет? Скажем для текстов, в которых может быть несколько языков исопльзовано тогда это уже не FTS будет а like '% sometext %' и решается через триграмные индексы. PS: не во всех языках пробелы являются разделителями слов (и вообще понятие разделителя слов в общем случае зависит от языка). -- Maxim Boguk www.postgresql-consulting.ru Не очень понятно, а если в тексте скажем гна русском встречаюются цитаты на английском и немецком? Ну SQL Server FTS нормально живет себе с нейтральным языком и с набором стандартных разделителей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 18:23 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, в src/test/modules/test_parser есть тестовый парсер, который по пробелам фигачит. FTS поддерживает кастом парсеры, словари, так что никто не мешает вам сварганить свой парсер и искать как хочешь. Более того, никто не мешает написать словарь, который генерит триграммы, если что. Я как-то написал словарь folded_string, который берет слово и складывает его посередине, что позволяет искать с помощью gin %text%. Не знаю, как все это поможет, но пищу для размышлений даст :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 19:31 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
Ролг ХупинMaxim Bogukпропущено... тогда это уже не FTS будет а like '% sometext %' и решается через триграмные индексы. PS: не во всех языках пробелы являются разделителями слов (и вообще понятие разделителя слов в общем случае зависит от языка). -- Maxim Boguk www.postgresql-consulting.ru Не очень понятно, а если в тексте скажем гна русском встречаюются цитаты на английском и немецком? Ну SQL Server FTS нормально живет себе с нейтральным языком и с набором стандартных разделителей. а каким образом like '% sometext %' зависит от наличия или отсутствия цитат на английском в тексте? -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 20:02 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
Maxim BogukРолг Хупинпропущено... Не очень понятно, а если в тексте скажем гна русском встречаюются цитаты на английском и немецком? Ну SQL Server FTS нормально живет себе с нейтральным языком и с набором стандартных разделителей. а каким образом like '% sometext %' зависит от наличия или отсутствия цитат на английском в тексте? -- Maxim Boguk www.postgresql-consulting.ru Не зависит, но вообще-то like будет долго искать в тексте, индексы не используются. Если не прав - исправьте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 12:59 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 13:01 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 13:04 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин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 ?))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2016, 04:44 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
dimonz80Ролг Хупинпропущено... пробелы, знаки vous êtes stupide est-ce pas you're stupid isn't it да? и че эт за слова такие est-ce , you're , isn't ?))) Можно и их разделить, это не принципиально. Имелось в виду - аналог нейтрального языка в SQL Server. Это простейший делитель на слова, никаких форм слов, и естественно допускаются такие случаи, когда неправильно с точки зрения какого-то языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2016, 12:03 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупинdimonz80пропущено... да? и че эт за слова такие est-ce , you're , isn't ?))) Можно и их разделить, это не принципиально. Имелось в виду - аналог нейтрального языка в SQL Server. Это простейший делитель на слова, никаких форм слов, и естественно допускаются такие случаи, когда неправильно с точки зрения какого-то языка. 本システムで提供する法令データは、総務省行政管理局が官報を基に、施行期日を迎えた一部改正法令等を被改正法令へ溶け込ます等により整備を行い、データ内容の正確性については、万全を期しておりますが、官報で掲載された内容と異なる場合は、官報が優先します。 а так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2016, 13:20 |
|
||
|
Как правильно сделать поиск?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, Я чего сказать-то хотел. Конечно можно порубить текст на куски пробелами ( или по 3 знака или еще как) и это иногда будет даже работать. Только ФТС без словаря и грамматического справочника, т.е. без информации о языке - это не ФТС. Морфология беспощадная ты с**а. Можно применить для нечеткого поиска всякие трюки: регулярки, саундексы, левенштейны, триграммы и т.п. Но это все будет проверкой на похожесть подряд идущих знаков, не более. Если ТСа это устроит то хорошо. Ему даже триграммы показали и сказали что по ним индекс можно строить. Но без инфы о языке свой яндекс не сделать, увы Вот неплохо про нечеткий поиск . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2016, 13:53 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39282141&tid=1997084]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
179ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 19ms |
| total: | 309ms |

| 0 / 0 |
