使用' NOT' Sphinx搜索中的运算符?

时间:2015-01-30 09:48:18

标签: sphinx

我有一个带有字段ID,日期和状态的索引'order'。我需要让所有订单没有状态已关闭

我的狮身人面像查询是:

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吗?

1 个答案:

答案 0 :(得分:3)

您已将该字词放在词组运算符中,因此它会查找短语!CLOSED - 但我怀疑您有这个词!在你的charset_table被忽略,所以只是搜索CLOSED。

... WHERE MATCH('@status !CLOSED')

理论上会起作用。但是,狮身人面像不能仅仅使用&#39; NOT&#39;来执行查询。条款。 Sphinx有一个倒排索引,列出哪些单词在哪些文件中。它没有所有文件的列表,然后它可以删除&#39;特定的。

...所以你需要一份所有文件的清单。最简单的方法是在所有文档中添加一个假关键字,例如修改你的源代码定义(在sphinx.conf中)以添加类似于...的虚假字段。

sql_query = SELECT id,...,'_all' as fake FROM sqltable ... 

然后可以在你的sphinx查询中使用它....

... WHERE MATCH('_all @status -CLOSED')