在 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')