184 похожих чатов

Всем доброго времени суток! Задача определить полноноту покрытия пользовательских интересов путем

определения наличия ключевых слов которые есть в нашей с-ме в пользовательских запросах.

Дано:
Есть N пользователсьских уникальных поисковых запросов.
Есть ключевые слова которые могут являтся тегами/категориями или ключевыми словами из определенной области.

Выполняется запрос вида:

SELECT DISTINCT query
FROM TABLE
WHERE not match(‘huge|regex|with|all|keywords’)
AND not match(‘huge|regex|with|all|keywords’)


-> это дает мне промежуточный результат в котором я могу отфильтровать дальше некоторые другие группы ключевых слов

Одна из таких груп, а точнее составленное такое регулярное выражение будет весить около 100мб.

Вопрос как бы вы подошли к решению такой задачи? Я пробовал разбивать на маленькие регулярные выражения, он т.к. в одном запросе ключевые слова могут повторятся я получаю ложно большее количество совпадений чем вообще есть запросов в с-ме. У меня из идей только пагинироваться по первому запросу а регулярку уже применять к каждой строке например в python, записывая результаты в файл.

6 ответов

9 просмотров

Сюда поглядите https://fiddle.clickhouse.com/318ec99d-97e9-4478-84f4-01867e74a4b6 Кажется, что можно hasToken будет лучше, регулярные выражения. А в свете недавно появившегося обратного (inverted) индекса, так и вообще должно быть отлично.

Если количество регекспов фиксированное, то свежепоявившийся regexp_tree Dictionary ваш путь. Но если переменный, то надо выкинуть описанную выше идею с регекспами и взять специализированный инструмент, скажем Manticore. Если же есть веские причины по которым вы это делаете на Clickhouse, то придется делать все тоже самое, что в обычном полнотекстовом поиске, а именно: - токенизатор - леммаризатор - обратный индекс - ранжирование Используя 3 первых искать просто и быстро. Обратный индекс - это отдельная табличка и подзапрос. Ну или новая фича (которая пока не то чтобы особо работает). Однако ранжирование - это тяжелый GROUP BY и вы улетаете на 300-600ms, что катастрофически много по сравнению с мантикоровскими 60ms.

Функции для токенизированич смотрели?

Alex GMT+4-Rainsar Автор вопроса

Привет! Посмотрел, насколько я понял что hasToken может проверять только наличие одного токена, т.е. если мне подходит например 1000 слов То я буду делать что-то вроде WHERE hastoken(field, ‘field’) OR hastoken(field, ‘field’) … OR hastoken(field, ‘field’) после чего мне нужно сохранить совпавшие индексы и игнорировать их на следующей пачке таких запросов?

Alex GMT+4 Rainsar
Привет! Посмотрел, насколько я понял что hasToken ...

Да, я был не прав, использование hasToken создает больше проблем, чем решает. Вариант с regex вроде как лучше. Если хотите, можете создать issue с просьбой добавить в hasToken возможность множественных needle, и описать вашу задачу как обоснование полезности такой доработки.

Alex GMT+4-Rainsar Автор вопроса
Ilya Golshtein
Да, я был не прав, использование hasToken создает ...

Нашел не плохое решение для себя с использованием multiMatchAllIndices, думаю использовать temporary таблицу чтобы сохранить уже сматченные id, посчитал по весу возможного количества ids - по памяти приемлемо. Пачками по 1000 токенов работает быстрее чем match

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

Обсуждают сегодня

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта