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?


person Sarita    schedule 22.05.2019    source источник


Ответы (1)


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

Запрос

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

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

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