代码之家  ›  专栏  ›  技术社区  ›  Nathan Wailes

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

  •  1
  • Nathan Wailes  · 技术社区  · 6 年前

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

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

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

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

    • 找出所有有这个元音序列的发音:。。。
    • 找出所有辅音XXX在YYY位置的发音。
    • 最后的 位置。
    • 找出所有在某个地方有这种词汇重音序列的发音:[0,2,1]

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

    但要明确的是:我感兴趣的主要问题是索引和查询音素列表。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

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

    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