ClickHouse- поиск по вложенным полям

У меня есть вложенное поле с именем items.productName, в котором я хочу проверить, содержит ли название продукта определенную строку.

SELECT * FROM test WHERE hasAny(items.productName,['Samsung'])

Это работает, только если название продукта — Samsung.

Я пробовал присоединиться к массиву

SELECT 
    *
FROM test
ARRAY JOIN items
WHERE items.productName LIKE '%Samsung%' 

Это работает, но очень медленно (~ 1 сек на 5 миллионов записей)

Есть ли способ выполнить как в hasAny?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
1 404
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добиться этого, используя функцию arrayFilter. Документы ClickHouse

Запрос

Select * from test where arrayFilter(x -> x LIKE '%Samsung%', items.productName) != []

Если вы не используете != [], вы получите сообщение об ошибке «DB::Exception: недопустимый тип массива (строка) столбца для фильтра. Должен быть вариант UInt8 или Nullable (UInt8) или Const».

Лучшим подходом к этому было бы использование функции arrayExists: WHERE arrayExists(x -> x LIKE '%Samsung%', items.productName). Это избавляет от необходимости сравнивать с пустым массивом и позволяет ClickHouse оптимизировать предложение путем короткого замыкания, когда найдено первое совпадающее значение массива, вместо того, чтобы перебирать весь массив.

jduncanator 20.07.2021 13:53

Другие вопросы по теме