В этой статье мы обсуждаем, как безсхемные документы могут быть использованы в Перколировать Запросы.
Функция Перколировать Запрос позволяет хранить не только совпадения по полному тексту, но и обычную фильтрацию по атрибутам.
До версии 2.7.0 это было ограничено одним условием числового атрибута.
Теперь фильтрация может работать с строковыми и JSON атрибутами. Фильтрация по JSON интересна тем, что вы можете тестировать безсхемные документы на основе сохраненных запросов. Фильтрация также теперь поддерживает множественную фильтрацию по атрибутам и использование выражений, что позволяет создавать более сложные сохраненные критерии.
mysql> insert into pq (query,filters) values('orange', 'j.price - 1 > 3');
mysql> insert into pq (query,filters) values('orange', 'j.price - 1 > 3 OR j.tag IS NOT null');
mysql> insert into pq (query,filters) values('orange', 'j.price - 1 > 3 OR any (x=\'test\' for x in j.tag)');
mysql> CALL PQ ('pq', ('{"title":"orange","id":10, "j":{ "price":5 } }',
'{"title":"orange","id":11, "j":{ "price":3 } }',
'{"title":"orange","id":12, "j":{ "tag":5 } }',
'{"title":"orange","id":13, "j":{ "tag":["test"] } }' ),
1 as docs, 1 as docs_json, 1 as query , 'id' as docs_id);
+------+-----------+--------+------+---------------------------------------------------+
| UID | Documents | Query | Tags | Filters |
+------+-----------+--------+------+---------------------------------------------------+
| 4 | 10 | orange | | j.price - 1 > 3 |
| 5 | 10,12,13 | orange | | j.price - 1 > 3 OR j.tag IS NOT null |
| 6 | 10,13 | orange | | j.price - 1 > 3 OR any (x='test' for x in j.tag) |
+------+-----------+--------+------+---------------------------------------------------+
3 rows in set (0.00 sec)
Поддержка атрибутов MVA появится в релизе 2.7.1.
Совпадение по полному тексту с безсхемными данными пока не поддерживается, мы планируем добавить это в будущем. На данный момент текстовые свойства, которые требуют совпадения по полному тексту, необходимо извлекать в отдельные текстовые поля.