如何在 SphinxQL 中使用 SNIPPET 功能?
How to use SNIPPET function in SphinxQL?
我有一个索引:
--------------------------------------------------
| id | name | folder | tag1 | tag2 | topic |
--------------------------------------------------
| 1 | file 1 | AAA | [1,2] | [3,4] | 1 |
--------------------------------------------------
| 2 | file 2 | BBB | [1] | [4,5] | 1 |
--------------------------------------------------
| 3 | file 3 | AAA | [2] | [4] | 2 |
--------------------------------------------------
我需要做的是按标签过滤文件,下面的请求工作正常:
SELECT id, name,
ANY(var=1 FOR var IN tag1) as tag_filter_1,
ANY(var=5 FOR var IN tag2) as tag_filter_2,
GROUP_CONCAT(id) as files
FROM index
WHERE tag_filter_1 = 1 AND tag_filter_2 = 1
GROUP BY topic;
现在我需要修改查询以仅对来自 AAA 文件夹的文件应用 tag1 过滤器,同时保留从所有文件夹中按 tag2 过滤。
我正在考虑 OR 条件,但它不受支持。此外,选项是使用 GROUP_CONCAT(tag1) 然后在 PHP 中过滤 Sphinx 结果,但 tag1 是JSON,不是标量。
我想知道是否可以使用 SNIPPET 或 IF 函数来解决这个问题,以及如何解决。或者有什么其他想法?
可能有点难看,但可以做到...
SELECT id, name,
ANY(var=1 FOR var IN tag1) OR NOT folder='AAA' AS tag_filter_1,
ANY(var=5 FOR var IN tag2) AS tag_filter_2
FROM index WHERE tag_filter_1 = 1 AND tag_filter_2 = 1;
tag_filter_1
成为应用 tag1 过滤器,OR 不是 AAA 文件夹。
所以AAA文件夹中的文档,需要匹配tag1过滤器(因为无法匹配第二部分)
.. 但由于 OR,其他文件夹中的文档将始终匹配,因此 tag1 过滤器将被忽略。
(没有 !=
字符串运算符,所以需要反转 =
运算符的使用 :)
我有一个索引:
--------------------------------------------------
| id | name | folder | tag1 | tag2 | topic |
--------------------------------------------------
| 1 | file 1 | AAA | [1,2] | [3,4] | 1 |
--------------------------------------------------
| 2 | file 2 | BBB | [1] | [4,5] | 1 |
--------------------------------------------------
| 3 | file 3 | AAA | [2] | [4] | 2 |
--------------------------------------------------
我需要做的是按标签过滤文件,下面的请求工作正常:
SELECT id, name,
ANY(var=1 FOR var IN tag1) as tag_filter_1,
ANY(var=5 FOR var IN tag2) as tag_filter_2,
GROUP_CONCAT(id) as files
FROM index
WHERE tag_filter_1 = 1 AND tag_filter_2 = 1
GROUP BY topic;
现在我需要修改查询以仅对来自 AAA 文件夹的文件应用 tag1 过滤器,同时保留从所有文件夹中按 tag2 过滤。
我正在考虑 OR 条件,但它不受支持。此外,选项是使用 GROUP_CONCAT(tag1) 然后在 PHP 中过滤 Sphinx 结果,但 tag1 是JSON,不是标量。
我想知道是否可以使用 SNIPPET 或 IF 函数来解决这个问题,以及如何解决。或者有什么其他想法?
可能有点难看,但可以做到...
SELECT id, name,
ANY(var=1 FOR var IN tag1) OR NOT folder='AAA' AS tag_filter_1,
ANY(var=5 FOR var IN tag2) AS tag_filter_2
FROM index WHERE tag_filter_1 = 1 AND tag_filter_2 = 1;
tag_filter_1
成为应用 tag1 过滤器,OR 不是 AAA 文件夹。
所以AAA文件夹中的文档,需要匹配tag1过滤器(因为无法匹配第二部分)
.. 但由于 OR,其他文件夹中的文档将始终匹配,因此 tag1 过滤器将被忽略。
(没有 !=
字符串运算符,所以需要反转 =
运算符的使用 :)