1

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

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

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

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

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

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

$data返回为false

也许还有另一种方法可以做到这一点。请帮忙。谢谢你。

4

2 回答 2

3

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

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

但是你让它工作。只需要给 sphinx 一个关键字,该关键字将出现在每个文档中。然后可以做

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

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

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

然后可以做

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

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

不要期望查询会非常快。

于 2012-08-09T18:07:53.367 回答
2

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

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

SPH_MATCH_BOOLEAN

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

SPH_MATCH_EXTENDED

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

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

于 2012-08-09T17:31:05.130 回答