是否可以通过Sphinx从空查询中排除某些关键字?
我的想法是使用Extended2匹配模式,为了排除关键字,我将使用-
或!
运算符。我只需要通过Sphinx获取数据而不使用任何查询(除了排除运算符)。
在Sphinx中,我使用以下方法获取数据:
$data = $sphinx->query('');
此查询返回不必匹配任何内容的数据(这意味着它将返回所有数据,当然仅限于查询限制)。问题是,如果我添加一个关键字!或 - 运算符,它不返回任何内容。例如:
$data = $sphinx->query('-google');
$data
以false
也许还有另一种方法可以解决这个问题。请帮忙。 谢谢。
答案 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将无法计算任何涉及搜索整个集合的查询。
对于允许您使用-
的两个选项,在文档中明确说明了这是不可能的:
无法评估像“-dog”这样隐式包含集合中所有文档的查询。
但是,查询必须能够在不涉及所有文档的隐式列表的情况下进行计算
简短的回答是:不,这是不可能的。唯一的选择是,如果要为一小部分关键字实现此功能,那么您可以在数据库中添加一个标志,并在文本包含此关键字时将值设置为true
。您可以使用搜索结果中的SetFilter()
排除它们。我正在使用这个技巧从我的列表中排除包含某组关键字的文档。