如何在sql中索引列表数据以快速搜索某些元素或元素组?

j9per5c4  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(333)

我将在一个mysql表中存储单词的发音,我希望有一种方法可以快速搜索具有某些属性的发音。
下面是一些数据的示例:
纯文字:“聚宝盆”
发音:[“k”,“ao2”,“r”,“n”,“ah0”,“k”,“ow1”,“p”,“iy0”,“ah0”]
如果你不熟悉发音,cmu发音词典有一个很好的解释,也是我如何生成这个例子的。
我能想到的存储列表数据的最简单方法就是将列表转储为json编码的字符串。问题是,这种方法似乎不允许在该列上使用有用的索引。
下面是一些我希望能够快速运行的查询示例(在数据库中索引相关数据):
找出所有有这个元音序列的发音:。。。
找出所有辅音在yyy位置的发音。
找出所有元音位于最后位置的发音。
找出所有在某个地方有这种词汇重音序列的发音:[0,2,1]
我的一个想法是分离出词汇重音信息(上例中每个元音音素右侧的数字)并分别存储重音信息(例如[2,0,1,0,0]),但即使这样,我也不确定如何索引它。
另一个似乎至少可以解决词法重音查询的想法可能是将每个可能的词法重音模式存储在一个单独的表中,然后让每个发音简单地(通过外键)引用其中一个词法重音模式。然后,我可以运行(python)服务器代码来检查较小的一组可能的词法重音模式,以确定哪些模式是匹配的,然后在发音表中查询具有这些重音模式之一的发音。但我很想知道是否有办法创建一个更快的纯sql解决方案。
但要明确的是:我感兴趣的主要问题是索引和查询音素列表。

6uxekuva

6uxekuva1#

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

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 表中的音素总数也会有所帮助。

相关问题