您可以采用另一张桌子,例如
ID KeywordID Word
1 1 blue
2 2 blue
3 1 cat
并转换字符串
"Blue cat green eyes 2342342"
在一系列索引和计数中:
SELECT KeywordID, COUNT(*) FROM ancillary WHERE Word IN ('blue','cat','green','eyes'...)
这将执行一系列精确匹配并返回,例如,
KeywordID Count
1 2
2 1
然后你知道id为1的关键字组有两个词,这意味着计数2匹配所有这些词。所以keywordid 1 是满足的。第 2 组也有两个词(黑色、猫)但只找到一个,匹配存在但不完整。
如果您还记录关键字集大小和关键字 ID,则来自同一 ID 的所有关键字将具有相同的 KeywordSize,您也可以 GROUP BY:
KeywordID KeywordSize Count
1 2 2
2 2 1
甚至可以SELECT COUNT(*)/KeywordSize AS match ... ORDER BY match
按相关性排序关键字匹配。
当然,一旦有了 KeywordID,就可以在关键字表中找到它。
执行
您想将关键字列表“黑色愤怒的猫”添加到现有表中。
所以你把这个关键词列表分解成单词:得到“black”、“angry”和“cat”。
您通常在已有的表中插入关键字列表,然后检索新创建的行的 ID,假设它是 1701。
现在您将单词插入到我们称为“辅助”的新表中。此表仅包含您的主表的关键字行 ID、单个单词以及该单词来自的单词列表的大小。
我们知道我们总共插入了 3 个单词,对于表第 1701 行,所以 size=3,我们插入这些元组:
(1701, 3, 'black')
(1701, 3, 'cat')
(1701, 3, 'angry')
(这些将收到他们自己的唯一 ID,但这与我们无关)。
现在一段时间后,我们收到一个句子,
'Schroedinger cat is black and angry'
我们可以首先针对要删除的空词列表运行查询,例如“is”和“and”。但这不是必需的。
然后我们可以运行与单词一样多的查询,从而发现任何地方都没有包含“Schroedinger”的行,我们可以删除它。但这也不是必需的。
最后,我们针对辅助构建真正的查询:
SELECT KeywordID, COUNT(*) AS total, ListSize*100/COUNT(*) AS match
FROM ancillary WHERE Word IN ('Schroedinger','cat','is','black','and','angry')
GROUP BY KeywordID;
将WHERE
返回,比如说,这些行:
(1234, 'black') -- from 'black cat'
(1234, 'cat') -- from 'black cat'
(1423, 'angry') -- from 'angry birds'
(1701, 'cat') -- from 'black angry cat'
(1701, 'angry') -- from 'black angry cat'
(1701, 'black') -- from 'black angry cat'
(1999, 'cat') -- from 'nice white cat'
所以 GROUP 将返回KeywordID
这些行的基数:
1423 1 50%
1701 3 100%
1234 2 100%
1999 1 33%
现在可以按匹配率降序排序,然后按列表大小降序排序(因为匹配 100% 的 3 个单词优于匹配 100% 的 2,匹配 1 in 2 优于匹配 2 in 3):
1701 3 100% -- our best match
1234 2 100% -- second runner
1423 1 50%
1999 1 33%
您还可以在一个查询中检索您的第一个表,并增加匹配率:
SELECT mytable.*, total, match FROM
mytable JOIN (
SELECT KeywordID, COUNT(*) AS total, ListSize*100/COUNT(*) AS match
FROM ancillary WHERE Word IN ('Schroedinger','cat','is','black','and','angry')
GROUP BY KeywordID
) AS ancil ON (mytable.KeywordID = ancil.KeywordID)
ORDER BY match DESC, total DESC;
最大的成本是必须在Word
列上索引的“辅助”中的精确匹配。