0

我通过一些对象的描述来编写全文搜索脚本。但是我对布尔模式下的默认全文搜索算法并不满意,所以我尝试以某种方式对其进行修改。我想将 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。但我想为所有三个子选择获取全局不同的行集。如果行出现在第一个块中,那么它在秒和第三个中一定不存在。我怎样才能做到这一点?或者您可以为这种搜索提供更优雅的解决方案吗?

4

1 回答 1

0

OK 重读问题。联合所有会给你所有的结果,联合应该给你不同的结果

或者你可以使用

`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`
于 2012-10-19T00:12:33.280 回答