我写了一个搜索查询来搜索相似的名字。它适用于电源组的标签,它按相似性排序。例如,如果搜索文本是:shakespeare tragedy hamlet
如何优化搜索SQL查询?
生成的SQL是:
SELECT DISTINCT id FROM (
(SELECT * FROM books
WHERE name LIKE '%shakespeare%'
AND name LIKE '%tragedy%'
AND name LIKE '%hamlet%' limit 10)
UNION
(SELECT * FROM books
WHERE name LIKE '%shakespeare%'
AND name LIKE '%tragedy%' limit 10)
UNION
(SELECT * FROM books
WHERE name LIKE '%shakespeare%'
AND name LIKE '%hamlet%' limit 10)
UNION
(SELECT * FROM books
WHERE name LIKE '%tragedy%'
AND name LIKE '%hamlet%' limit 10)
UNION
(SELECT * FROM books WHERE name LIKE '%shakespeare%' limit 10)
UNION
(SELECT * FROM books WHERE name LIKE '%tragedy%' limit 10)
UNION
(SELECT * FROM books WHERE name LIKE '%hamlet%' limit 10)
) limit 10
有两个问题:
的发电机组在我的查询创建
2^tags - 1
工会,这意味着如果有些人想要精确并使用6个标签,这将是63个工会,它使我的查询变得更慢。如果第一个联合返回10行,其他联合是无用的。
有没有一种方法来优化此查询?
生成此sql的代码在哪里?你只是在寻找一个将包含所有标签的行吗?或者其中的1个足够像查询的最后3行 – sagi
@sagi我相信每个人都知道powerset是如何工作的,这就是为什么我没有经历代码。我正在寻找按相似性排序的类似行。 –