В этой статье мы обсуждаем параметр docs_id, который обеспечивает более простую работу с результатом CALL PQ набором.
Рассмотрим следующий пакетный вызов PQ:
mysql> CALL PQ ('pq', ('{"title":"butter is good as", "id":3}',
'{"title":"was butter","id":4}',
'{"title":"sas was butter","id":5}',
'{"title":"bas was butter", "id":6}',
'{"title":"butter is good as","id":7}'),
1 as docs_json ,1 as docs,1 as query);
+------+-----------+------------+------+---------+
| UID | Documents | Query | Tags | Filters |
+------+-----------+------------+------+---------+
| 1 | 1,5 | butter is | | |
| 2 | 2,3,4 | butter was | | |
+------+-----------+------------+------+---------+
2 rows in set (0.00 sec)
Что не так с этим выводом?
Мы получаем список пар запросов и позиций документов во входном массиве, однако у наших документов есть идентификатор — атрибут id.
Если мы хотим передать результат в следующий процесс, нам потребуется выполнить постобработку, чтобы извлечь идентификаторы документов из входного массива, используя позиции.
Чтобы избежать этой постобработки в версии 2.7.0, мы добавили новую опцию docs_id, которая позволяет заменять позиции документов значением атрибута документа.
mysql> CALL PQ ('pq', ('{"title":"butter is good as", "id":3}',
'{"title":"was butter","id":4}',
'{"title":"sas was butter","id":5}',
'{"title":"bas was butter", "id":6}',
'{"title":"butter is good as","id":7}'),
1 as docs_json ,1 as docs,1 as query, 'id' as docs_id);
+------+-----------+------------+------+---------+
| UID | Documents | Query | Tags | Filters |
+------+-----------+------------+------+---------+
| 1 | 3,7 | butter is | | |
| 2 | 4,5,6 | butter was | | |
+------+-----------+------------+------+---------+
2 rows in set (0.01 sec)
Теперь у нас есть идентификаторы документов (или другие выбранные идентификаторы) в наборе результатов PQ.
Выбранный атрибут docs_id должен быть целочисленным атрибутом. Его значения не обязательно должны быть уникальными. Например, запросы могут быть логически сгруппированы по другому целочисленному атрибуту. Если нам нужно узнать только группы, соответствующие критерию, мы можем использовать этот атрибут вместо идентификатора документа:
mysql> CALL PQ ('pq', ('{"title":"butter is good as", "id":3,"gid":10}',
'{"title":"was butter","id":4,"gid":20}',
'{"title":"sas was butter","id":5,"gid":10}',
'{"title":"bas was butter", "id":6,"gid":20}',
'{"title":"butter is good as","id":7,"gid":10}'),
1 as docs_json ,1 as docs,1 as query, 'gid' as docs_id);
+------+-----------+------------+------+---------+
| UID | Documents | Query | Tags | Filters |
+------+-----------+------------+------+---------+
| 1 | 10 | butter is | | |
| 2 | 10,20 | butter was | | |
+------+-----------+------------+------+---------+
2 rows in set (0.00 sec)