从Sphinx中的空查询中排除关键字

时间:2012-08-09 13:50:29

标签: php sphinx

是否可以通过Sphinx从空查询中排除某些关键字?

我的想法是使用Extended2匹配模式,为了排除关键字,我将使用-!运算符。我只需要通过Sphinx获取数据而不使用任何查询(除了排除运算符)。

在Sphinx中,我使用以下方法获取数据:

$data = $sphinx->query('');

此查询返回不必匹配任何内容的数据(这意味着它将返回所有数据,当然仅限于查询限制)。问题是,如果我添加一个关键字!或 - 运算符,它不返回任何内容。例如:

$data = $sphinx->query('-google');

$datafalse

的形式返回

也许还有另一种方法可以解决这个问题。请帮忙。 谢谢。

2 个答案:

答案 0 :(得分:3)

Sphinx不喜欢否定查询。如果你检查GetLastError()/ GetLastWarning(),它会明确说出来。

主要原因是,它无法有效地使用其索引。 Sphinx基于倒排索引的概念。因此,要运行此查询,需要获取每个文档的列表,然后删除与该关键字匹配的列表。

但是你让它发挥作用。只需要为sphinx提供一个关键字,该关键字将出现在每个文档中。然后就可以了

$data = $sphinx->query('popularword -google');

如果你没有一个单词,那就是每个文件,只需添加一个假文件:)

sql_query = SELECT id, '__ALL__' as dummy, title .......

然后就可以了

$data = $sphinx->query('__ALL__ -google');

这个词将出现在每个文件上。

不要指望查询非常快。

答案 1 :(得分:2)

据我所知,这是不可能的。 Sphinx将无法计算任何涉及搜索整个集合的查询。

对于允许您使用-的两个选项,在文档中明确说明了这是不可能的:

SPH_MATCH_BOOLEAN

  

无法评估像“-dog”这样隐式包含集合中所有文档的查询。

SPH_MATCH_EXTENDED

  

但是,查询必须能够在不涉及所有文档的隐式列表的情况下进行计算

简短的回答是:不,这是不可能的。唯一的选择是,如果要为一小部分关键字实现此功能,那么您可以在数据库中添加一个标志,并在文本包含此关键字时将值设置为true。您可以使用搜索结果中的SetFilter()排除它们。我正在使用这个技巧从我的列表中排除包含某组关键字的文档。