MySQL匹配词集

MySQL匹配词集,mysql,sql,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

我有一张桌子存放书名。每当我插入一个新标题时,我都要检查该标题是否已经存在。问题是,由于打字错误,不可能精确匹配

比如说

'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中存储数据的最佳方式是什么?

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

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

我可能会有一个只用于标记的表,并垂直存储它们

CREATE TABLE BookTag (
    BookId INT,
    Tag NVARCHAR(50))
然后在插入书籍时,首先计算标签并将其存储在临时表中。我将编写一个函数,从字符串中获取第n个最大的字。对于这个例子,我将假设这个函数存在并且被称为
nthlatersword(VARCHAR expression,INT n)

现在,您可以将此表连接到现有标记的表中,以查看是否有2个相同的表

SELECT e.BookId
FROM NewBookTag n
INNER JOIN BookTag e ON n.Tag = e.Tag
GROUP BY e.BookId
HAVING COUNT(*) >= 2
如果存在,您可以将其放入一个
,如果为false,则插入一个

同样在插入书籍之后,您已经准备好了要插入的标签

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

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

您可以尝试进行模糊搜索以查看书名是否存在。问题是你可以有相同标题的书。匹配应该在ISBN号码或类似号码上进行,而不是在标题上。@fqhv谢谢,soundex听起来很有希望。但是如果单词的顺序改变了,它就不起作用了。
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