如何索引 SQL 中的列表数据以快速搜索某些元素或元素组?
How can I index list data in SQL for rapid search on certain elements or groups of elements?
我将把单词的发音存储在 MySQL table 中,我希望有一种方法可以快速搜索具有特定属性的发音。
下面是一些数据的示例:
- 明文单词:"cornucopia"
- 发音: ["K", "AO2", "R", "N", "AH0", "K", "OW1", "P"、"IY0"、"AH0"]
- 如果您不熟悉发音,CMU Pronouncing Dictionary 有很好的解释,这就是我生成此示例的方式。
我能想到的存储列表数据的最简单方法是将列表转储为 json 编码的字符串。问题是该方法似乎不允许在该列上使用有用的索引。
以下是我希望能够运行 非常快速的一些示例查询(相关数据已在我的数据库中编入索引):
- 查找具有此元音序列的所有发音:...
- 找出在 YYY 位置有辅音 XXX 的所有发音。
- 查找在最后位置有元音 XXX 的所有发音。
- 找到其中某处具有此词汇重音序列的所有发音:[0, 2, 1]
我的一个想法是分离出词汇重音信息(上例中每个元音音素右侧的数字)并单独存储该重音信息(例如 [2, 0, 1, 0 , 0]), 但即使那样我也不确定如何索引它。
另一个似乎至少可以解决词汇重音查询的想法可能是将每个可能的词汇重音模式存储在单独的 table 中,然后让每个发音简单地引用(通过外键)其中一种词汇重音模式。然后我可以 运行 我的 (Python) 服务器代码针对较小的一组可能的词汇重音模式来确定哪些模式是匹配的,然后查询发音 table 以获得那些具有其中一种压力模式。但我很想知道是否有某种方法可以创建更快的纯 SQL 解决方案。
但要明确一点:我感兴趣的主要问题是索引和查询音素列表。
最好的结构可能是 table 每个音素一行:
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
table有音素总数也有帮助。
我将把单词的发音存储在 MySQL table 中,我希望有一种方法可以快速搜索具有特定属性的发音。
下面是一些数据的示例:
- 明文单词:"cornucopia"
- 发音: ["K", "AO2", "R", "N", "AH0", "K", "OW1", "P"、"IY0"、"AH0"]
- 如果您不熟悉发音,CMU Pronouncing Dictionary 有很好的解释,这就是我生成此示例的方式。
我能想到的存储列表数据的最简单方法是将列表转储为 json 编码的字符串。问题是该方法似乎不允许在该列上使用有用的索引。
以下是我希望能够运行 非常快速的一些示例查询(相关数据已在我的数据库中编入索引):
- 查找具有此元音序列的所有发音:...
- 找出在 YYY 位置有辅音 XXX 的所有发音。
- 查找在最后位置有元音 XXX 的所有发音。
- 找到其中某处具有此词汇重音序列的所有发音:[0, 2, 1]
我的一个想法是分离出词汇重音信息(上例中每个元音音素右侧的数字)并单独存储该重音信息(例如 [2, 0, 1, 0 , 0]), 但即使那样我也不确定如何索引它。
另一个似乎至少可以解决词汇重音查询的想法可能是将每个可能的词汇重音模式存储在单独的 table 中,然后让每个发音简单地引用(通过外键)其中一种词汇重音模式。然后我可以 运行 我的 (Python) 服务器代码针对较小的一组可能的词汇重音模式来确定哪些模式是匹配的,然后查询发音 table 以获得那些具有其中一种压力模式。但我很想知道是否有某种方法可以创建更快的纯 SQL 解决方案。
但要明确一点:我感兴趣的主要问题是索引和查询音素列表。
最好的结构可能是 table 每个音素一行:
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
table有音素总数也有帮助。