我通过描述一些对象来编写全文搜索脚本。但我对布尔模式下的默认全文搜索算法不满意,所以我尝试以某种方式修改它。我想将3个搜索组合成一个。第一个查询我搜索“精确短语”,第二个 - 短语的所有单词,第三个 - 至少有一个单词存在。然后按优先级返回。我必须做这样的事情:
SELECT
description,
MATCH(description) AGAINST ('"my search"' in boolean mode) FROM search
WHERE MATCH(description) AGAINST ('"my search"' in boolean mode)
UNION DISTINCT
SELECT
description,
MATCH(description) AGAINST ('+my +search' in boolean mode) FROM search
WHERE MATCH(description) AGAINST ('+my +search' in boolean mode)
UNION
SELECT
description,
MATCH(description) AGAINST ('my* search*' in boolean mode) FROM search
WHERE MATCH(description) AGAINST ('my* search*' in boolean mode)
如您所见,第一行行将包含最相关的结果 - 精确短语。第二个块将包含较少的相关行,第三个块将包含所有其余的行。
但是这个查询返回重复的行,换句话说,第一个块中存在的行,可以在第二个块中重复,或者第三个,即使我使用UNION DISTINCT。但是我想为所有三个子选择获得全局不同的行集。如果行出现在第一个块中,则它必须不存在于秒和第三个块中。我怎样才能做到这一点?或者你可以为这种搜索提供更优雅的解决方案吗?
答案 0 :(得分:0)
确定重新阅读问题。联盟都会给你所有的结果,工会应该给你明显的结果
或者你可以使用
`Select distinct * from
(SELECT
description,
MATCH(description) AGAINST ('"my search"' in boolean mode) FROM search
WHERE MATCH(description) AGAINST ('"my search"' in boolean mode)
UNION DISTINCT
SELECT
description,
MATCH(description) AGAINST ('+my +search' in boolean mode) FROM search
WHERE MATCH(description) AGAINST ('+my +search' in boolean mode)
UNION
SELECT
description,
MATCH(description) AGAINST ('my* search*' in boolean mode) FROM search
WHERE MATCH(description) AGAINST ('my* search*' in boolean mode)) B`