mysql - 在数据库 mysql 中存储和检索同义词的最佳方法

标签 mysql synonym

我正在制作一个同义词列表,我会将其存储在数据库中并在进行全文搜索之前检索它。

当用户输入like:word1

我需要在我的同义词表中查找这个词。因此,如果找到该词,我将选择该词的所有同义词,并在下一个查询的全文搜索中使用它,我将其构造为

匹配(列名)反对((word1a word1b word1c) bool 模式)

那么如何将同义词存储在表中呢?我找到了 2 个选择:

  1. 像这样使用键和词列

    val  keyword
    -------------
    1    word1a
    1    word1b
    1    word1c
    2    word2a
    2    word2b
    3    word3a
    etc.
    

这样我就可以在一个查询中找到与输入的词完全匹配的词并找到它的 ID。在下一个选择中,我得到所有具有该 ID 的单词,并以某种方式使用服务器端语言中的记录集循环将它们连接起来。然后我可以在主表上构建真正的搜索,我需要查找这些词。

  1. 只使用像这样的单词列

    word1a|word1b|word1c
    word2a|word2b|word2c
    word3a
    

现在,如果它在任何记录中,我就为我的单词选择 SELECT,如果是,则提取所有记录并在 | 处展开它我又可以使用我的话了。

对于创建同义词数据库的人来说,第二种方法看起来更容易维护,但我看到了两个问题:

a) 如果一个单词在字符串中,我如何在 mysql 中查找?我不喜欢“word1a”,因为同义词在某种程度上可能非常相似,word1a 可能是草莓,草莓可能是鸟,而单词 2a 可能是浆果。显然我需要精确匹配,那么 LIKE 语句怎么能在字符串中精确匹配呢?

b) 我看到了一个速度问题,我猜使用 LIKE 比使用第一种精确匹配单词的方法“=”需要更多的 mysql。另一方面,在第一个选项中,我需要 2 个语句,一个用于获取单词的 ID,第二个用于获取具有该 ID 的所有单词。

你会如何解决这个问题,更多的是采取哪种方法的困境?有没有第三种我看不到的方式,管理员可以轻松添加/编辑同义词,同时又快速又最佳?好的,我知道通常没有最好的方法 ;-)

更新:使用两个表(一个用于主词,第二个用于同义词)的解决方案不适用于我的情况。因为我没有用户在搜索字段中键入的主词。他可以在该字段中键入任何同义词,所以我仍然想知道如何设置此表,因为我没有在一个表中有 ID 的主词和在第二个表中有主 ID 的同义词。没有主词。

最佳答案

不要使用(一个)字符串来存储不同的条目。

换句话说:建立一个单词表(word_ID,word)和一个同义词表(word_ID,synonym_ID),然后将单词添加到单词表中,并将每个同义词的一个条目添加到同义词表中。

UPDATE(添加了第三个同义词)

你的单词表必须包含每个单词(ALL),你的同义词表只包含指向同义词的指针(而不是单个单词!)..

如果您有三个词:A、B 和 C,它们是同义词,您的数据库将是

WORD_TABLE            SYNONYM_TABLE
ID | WORD             W_ID | S_ID
---+-----             -----+-------
1  | A                  1  |  2
2  | B                  2  |  1
3  | C                  1  |  3
                        3  |  1
                        2  |  3
                        3  |  2  

不要害怕 SYNONYM_TABLE 中的许多条目,它们将由计算机管理,并且需要它们来反射(reflect)单词之间的现有关系。



第二种方法

您可能也想(我认为您不应该!)使用一个表,该表具有单独的单词字段和同义词(或 ID)列表 (word_id,word,synonym_list)。请注意,这与关系数据库的工作方式相反(一个字段,一个事实)。

关于mysql - 在数据库 mysql 中存储和检索同义词的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3974671/

相关文章:

mysql - 嵌套 MySQL 查询列别名

haskell - 约束类型的同义词

elasticsearch:我可以用 boost 定义同义词吗?

elasticsearch - elasticsearch 7 中的同义词聚合 - 基于术语

python - 是否有任何 python 库可以让我得到一个词的同义词?

php - mysql。所有实体的所有属性 1 个表或每个实体 1 个表

MySQL Workbench 6.1 - 没有插入行的选项?

MySQL - 拉取列表待定日期

sql - 如何检查同义词后面的表是否存在

C# 对 SSPI 的调用失败,请参阅内部异常 - 无法联系本地安全机构