在SphinxQL中替换'OR'

时间:2014-05-27 09:22:33

标签: sql sphinx sphinxql

我目前正在尝试将Sphinx搜索引擎集成到Python应用程序中。问题是SphinxQL不像常见的SQL那样支持OR子句。有一些黑客可以使用,就像在SELECT中编写表达式一样:

SELECT id,(field1 = val1 OR field2 = val2) as expr FROM foo_bar WHERE expr = 1;

但是,它不适用于字符串,因为它们应该使用MATCH函数来处理。所以我决定将查询分成单独的子查询并组合获得的结果。然而,仍然存在获得适当的META信息的问题,尤其是total_found字段。 Sphinx将其计为单独的查询,但从这些查询获得的行可能会交叉,我无法检查它(数据库很大)。

我相信必须有一个解决方案。我正在使用Sphinxit(SphinxAlchemy与我正在使用的SQLAlchemy有版本冲突)。

SphinxSearch forum重新发布:

我有一个表,我需要搜索文本和数字列。我需要 用OR条件写一个查询;发现有一种方法可以使用SELECT 表达式如:

SELECT *, quantity>=50 OR quantity=0 AS mycond FROM table1 WHERE mycond = 1;

绝对无法使用字符串属性。不解析此查询:

SELECT *, category='foo' OR category='bar' AS mycond FROM table1 WHERE mycond = 1;

然而,这在Beta 2.2.3中有效:

SELECT * FROM table1 WHERE category='foo';

我该怎么做才能找到符合其中一个条件的行数,而不是每个条件的行数? 我可以进行一些查询并将获得的项目合并到一个列表中,但我现在需要如何 现在,这些行中的大部分都在数据库中。

1 个答案:

答案 0 :(得分:2)

对于属性/方面或者,我认为你是正确的,唯一的方法是在SELECT子句中放置一个表达式。

但是对于字符串,请查看documentation on the fulltext query syntax。你不能完全使用OR关键字,但这样的事情应该有效:

SELECT id, name 
FROM recipes
WHERE MATCH('(@ingredients chocolate) | (@name cake)')
LIMIT 10;