SphinxQL MATCH子句OR条件顺序引发查询结果异常问题
问题:调整MATCH子句OR条件顺序后无查询结果?
我执行以下查询语句:
SELECT * FROM stockcategories_fr WHERE MATCH('@mycolumn ^t-shirt|^tee-shirt|^ tee-shirt|^ t-shirt');
返回结果包含:
- T-shirts
- T-shirts enfant
...
但调整OR条件顺序后执行:
SELECT * FROM stockcategories_fr WHERE MATCH('@mycolumn ^tee-shirt|^ tee-shirt|^t-shirt|^ t-shirt');
却没有任何结果返回。
已知mycolumn字段中不含"tee-shirt"相关内容,仅调整了MATCH子句中OR条件的顺序,请问这是操作有误吗?
最终给每个匹配项添加括号后,查询恢复正常:
SELECT * FROM stockcategories_fr WHERE MATCH('@mycolumn ^(tee-shirt)|^ (tee-shirt)|^(t-shirt)|^ (t-shirt)');
原因与解决方法
这是全文检索语法的优先级问题导致的:^(前缀匹配符)的优先级比|(逻辑OR符)高,未加括号时,引擎对OR条件的分组解析不符合预期。
- 第一种查询顺序里,
^t-shirt被正确识别为匹配以t-shirt开头的内容,即便后面的tee-shirt相关条件无匹配,只要前面的t-shirt前缀有匹配结果,就能返回数据。 - 第二种查询顺序里,开头的
^tee-shirt和^ tee-shirt都没有匹配数据,而后续的^t-shirt因为优先级问题,被引擎错误地和前面的条件绑定在一起,没有被当成独立的前缀匹配分支,所以整体无结果返回。
给每个匹配项加上括号后,相当于明确告诉引擎:每个^只作用于括号内的内容,每个^(xxx)都是独立的OR分支,这样就能正确识别到t-shirt前缀的匹配条件,查询也就恢复正常了。
内容的提问来源于stack exchange,提问作者vegmaster
相关产品推荐
相关产品推荐

