这是another question I recently asked的后续行动。
我目前有一个像这样的SphinxQL查询:
SELECT * FROM my_index
WHERE MATCH(\'@field1 "a few words"/1 @field2 "more text here"/1\')
但是,我仍然希望在行中某个字段为空的情况下匹配行。
例如,假设数据库中存在以下行:
field1 | field2
-----------------------
words in here | text in here
| text in here
上面的查询将匹配第一行,但它与第二行不匹配,因为仲裁运算符指定每个字段必须有一个或多个匹配。
我问的可能吗?
我正在尝试使用的实际查询在Barry Hunter's answer中提供给我之前的问题:
sphinxQL> SELECT *, WEIGHT() AS w FROM index
WHERE MATCH('@tags "cute hairy happy"/1 @tags2 "one two thee"/1') AND w = 2
OPTION ranker=expr('SUM(IF(word_count>=IF(user_weight=2,tags2_len,tags_len),1,0))'),
field_weights=(tags=1,tags2=2);
答案 0 :(得分:1)
第一个问题是sphinx没有索引"空"所以你无法搜索它。 (实际上field_len
属性将为零。但是将属性过滤器与MATCH()结合起来可能很困难。
...所以安排空来做索引
sql_query = SELECT id,...,IF(tags='','_empty_',tags) AS tags FROM ...
然后修改查询。碰巧你的仲裁搜索很简单!
@field1 "a few words _empty_"/1
它只是另一个词。但是更复杂的查询只需要与该单词进行“或”运算。
然后让它在您的复杂查询中工作。但幸运的是,它真的很容易。 _empty_
只是另一个词。在字段为空的情况下,一个单词将匹配。 (即字段中没有单词,不在查询中)
所以只需将_empty_
添加到两个法定人数中即可!