Percolate Queries: docs_id option

В этой статье мы обсуждаем опцию 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)

Установить Manticore Search

Установить Manticore Search