我正在制作一个同义词列表,将其存储在数据库中并在进行全文搜索之前检索它。
当用户输入时:word1
我需要在我的同义词表中查找这个词。所以如果找到这个词,我会选择这个词的所有同义词,并在下一个查询的全文搜索中使用它,在那里我构造查询,如
MATCH (columnname) AGAINST ((word1a word1b word1c) IN BOOLEAN MODE)
那么如何将同义词存储在表中?我找到了 2 个选择:
使用 key 和 word 列,如
val keyword ------------- 1 word1a 1 word1b 1 word1c 2 word2a 2 word2b 3 word3a etc.
因此,我可以在一个查询中找到输入的单词的完全匹配并找到它的 ID。在下一个选择中,我得到具有该 ID 的所有单词,并以某种方式使用服务器端语言中的记录集循环将它们连接起来。然后,我可以在需要查找单词的主表上构建真正的搜索。
仅使用单词列,例如
word1a|word1b|word1c word2a|word2b|word2c word3a
现在,如果我的单词在任何记录中,我将选择它,如果是,则提取所有记录并将其分解为 | 我又能用我的话了。
对于制作这个同义词数据库的人来说,第二种方法看起来更容易维护,但我发现了两个问题:
a) 如果一个单词在字符串中,我如何在 mysql 中找到?我不能喜欢“word1a”,因为同义词可能非常相似,word1a 可能是草莓,草莓可能是鸟,而单词 2a 可能是浆果。显然我需要完全匹配,那么 LIKE 语句如何在字符串中完全匹配?
b)我看到一个速度问题,我猜使用 LIKE 会比使用我精确匹配单词的第一种方法的“=”花费更多的 mysql。另一方面,在第一个选项中,我需要 2 个语句,一个获取单词的 ID,第二个获取具有此 ID 的所有单词。
你将如何解决这个问题,更多的是采取哪种方法?是否有第三种方式我认为管理员不容易添加/编辑同义词,同时又快又优化?好的,我知道通常没有最好的方法;-)
更新:在我的情况下,使用两个表的解决方案,一个用于主词,第二个用于同义词。因为我没有用户在搜索字段中键入的 MASTER 词。他可以在该字段中键入任何同义词,所以我仍然想知道如何设置这些表,因为我没有主词,我会在一个表中拥有 ID,而在第二个表中具有主 ID 的同义词。没有主语。