如何在SQL中为数据列表编制索引,以便快速搜索某些元素或元素组?

时间:2018-09-13 12:17:29

标签: mysql sql rdbms

我将把单词的发音存储在MySQL表中,我希望有一种方法可以快速搜索具有某些属性的发音。

下面是一些数据看起来像的例子:

  • 纯文字:“聚宝盆”
  • 发音:[“ K”,“ AO2”,“ R”,“ N”,“ AH0”,“ K”,“ OW1”,“ P”,“ IY0”,“ AH0”]

我想到的最简单的存储列表数据的方法是将列表作为json编码的字符串转储。问题在于这种方法似乎不允许在该列上使用有用的索引。

以下是一些我希望能够非常快速地运行的示例查询(在数据库中索引了相关数据):

  • 找到所有具有以下元音序列的发音:...
  • 查找在YYY位置具有辅音XXX的所有发音。
  • 找到在最后位置具有元音XXX的所有发音。
  • 在其中某些位置找到具有此词汇重音序列的所有发音:[0,2,1]

我遇到的一个想法是分离词汇重音信息(在上面的示例中,每个元音音素右边的数字)并分别存储该重音信息(例如[2,0,1,0,0 ]),但即使如此,我仍然不确定如何索引它。

似乎至少可以解决词法重音查询的另一个想法可能是将每种可能的词法重音模式存储在单独的表中,然后使每个发音简单地(通过外键)引用这些词法重音模式之一。然后,我可以针对较小的一组可能的词法重音模式运行(Python)服务器代码,以确定哪些模式是匹配的,然后在发音表中查询具有那些重音模式之一的那些发音。但是我很想知道是否有某种方法可以创建更快的纯SQL解决方案。

但要清楚一点:我感兴趣的主要问题是索引和查询音素列表。

1 个答案:

答案 0 :(得分:1)

最好的结构可能是一个表,每个音素有一行:

create table WordPhonemes (
    WordPhonemeId int auto_increment primary key,
    WordId int not null,
    Position int not null,
    Phoneme varchar(255),
    foreign key (WordId) references Words(WordId),
    index(WordId, Position),
    index(Phoneme),
    index(WordId, Phoneme)
);

并非所有查询都不一定那么简单。但是,索引会有所帮助。此外,如果Words表中的音素总数也有帮助。