在 Sphinx 搜索中使用 'NOT' 运算符?
Using 'NOT' operator in Sphinx Search?
我有一个索引 'order',其中包含字段 ID、日期和状态。我需要获取所有状态为 CLOSED.
的订单
我的 sphinx 查询是:
SELECT id, status FROM order
WHERE MATCH('@status "!CLOSED"') AND id < 21;
+------+-------------+
| id | status |
+------+-------------+
| 10 | CLOSED |
| 1 | CLOSED |
| 4 | CLOSED |
| 5 | CLOSED |
| 7 | CLOSED |
| 9 | CLOSED |
| 14 | CLOSED |
| 18 | CLOSED |
| 19 | CLOSED |
+------+-------------+
9 rows in set (0.06 sec)
我哪里错了?如果我不想在多个领域怎么做?
你能帮我重写这个 SphinxQL 吗?
您已将词条放入短语运算符中,因此它正在寻找短语 !CLOSED
- 但我怀疑您有!在您的 charset_table
中,它被忽略了,因此变成了对 CLOSED 的搜索。
... WHERE MATCH('@status !CLOSED')
理论上可行。但是 sphinx 无法仅使用 'NOT' 项执行查询。
Sphinx 有一个倒排索引,列出哪些词在哪些文档中。它没有所有文档的列表,然后可以 'remove' 特定的文档。
...所以您需要所有文档的列表。最简单的方法是向所有文档添加一个假关键字,例如修改您的源定义(在 sphinx.conf 中)以添加一个假字段,例如...
sql_query = SELECT id,...,'_all' as fake FROM sqltable ...
然后可以在您的 sphinx 查询中使用它....
... WHERE MATCH('_all @status -CLOSED')
我有一个索引 'order',其中包含字段 ID、日期和状态。我需要获取所有状态为 CLOSED.
的订单我的 sphinx 查询是:
SELECT id, status FROM order
WHERE MATCH('@status "!CLOSED"') AND id < 21;
+------+-------------+
| id | status |
+------+-------------+
| 10 | CLOSED |
| 1 | CLOSED |
| 4 | CLOSED |
| 5 | CLOSED |
| 7 | CLOSED |
| 9 | CLOSED |
| 14 | CLOSED |
| 18 | CLOSED |
| 19 | CLOSED |
+------+-------------+
9 rows in set (0.06 sec)
我哪里错了?如果我不想在多个领域怎么做? 你能帮我重写这个 SphinxQL 吗?
您已将词条放入短语运算符中,因此它正在寻找短语 !CLOSED
- 但我怀疑您有!在您的 charset_table
中,它被忽略了,因此变成了对 CLOSED 的搜索。
... WHERE MATCH('@status !CLOSED')
理论上可行。但是 sphinx 无法仅使用 'NOT' 项执行查询。 Sphinx 有一个倒排索引,列出哪些词在哪些文档中。它没有所有文档的列表,然后可以 'remove' 特定的文档。
...所以您需要所有文档的列表。最简单的方法是向所有文档添加一个假关键字,例如修改您的源定义(在 sphinx.conf 中)以添加一个假字段,例如...
sql_query = SELECT id,...,'_all' as fake FROM sqltable ...
然后可以在您的 sphinx 查询中使用它....
... WHERE MATCH('_all @status -CLOSED')