MySQL匹配单词集

时间:2017-04-21 16:31:31

标签: mysql sql

我有一张表来存储书名。每当我插入新标题时,我想检查,如果标题已经存在。问题在于,由于拼写错误,无法进行完全匹配。

例如

'My Dream of Wonder Land'
'My Deam of Wonder Land'

所以我的目标是为每个标题创建标签,每本书最多包含3个标签。这些标签是标题中最长的3个单词:

'My Dream of Wonder Land' = dream, wonder, land
'My Deam of Wonder Land'= deam, wonder, land

现在当我添加标题时,我想找到所有标题,至少有两个匹配的标签。应忽略标签的顺序,这意味着

'land, dream, lego'

也应该匹配。

在MySQL中存储数据的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我建议使用fuzzy matching,因为这些比较可能非常复杂。

也就是说,您使用标签的想法听起来更有趣。

我可能只有标签表并垂直存储它们。

CREATE TABLE BookTag (
    BookId INT,
    Tag NVARCHAR(50))

然后在插入书籍时,您首先要计算标签并将它们存储在临时表中。我会编写一个函数,从字符串中获取n th 最大的单词。对于这个例子,我只是假设这个函数存在并被称为nthLargestWord(VARCHAR expression, INT n)

INSERT INTO TEMPORARY NewBookTag (Tag)
SELECT nthLargestWord(@booktitle, 1)
UNION
SELECT nthLargestWord(@booktitle, 2)
UNION
SELECT nthLargestWord(@booktitle, 3)

您现在可以将此表格加入现有代码表中,看看是否有2个共同点。

SELECT e.BookId
FROM NewBookTag n
INNER JOIN BookTag e ON n.Tag = e.Tag
GROUP BY e.BookId
HAVING COUNT(*) >= 2

当它为假时,你可以将它放在IF EXISTS插入中。

插入图书后,您已准备好插入标签了!

INSERT INTO Book (BookTitle)
VALUES (@BookTitle)

INSERT INTO BookTag (BookId, Tag)
SELECT b.BookId, t.Tag
FROM Book b
INNER JOIN NewBookTag t ON b.Title = @booktitle

此解决方案允许您一次插入一本书,如果需要,可以重构以允许多个。