Как я могу индексировать данные списка в SQL для быстрого поиска по определенным элементам или группам элементов? - PullRequest
0 голосов
/ 13 сентября 2018

Я собираюсь хранить произношения слов в таблице MySQL, и я хотел бы иметь способ быстрого поиска произношения, которые имеют определенные свойства.

Вот пример того, что некоторые данные могутвыглядеть как:

  • текстовое слово: "рог изобилия" * произношение 1006 *
  • : ["K", "AO2", "R", "N", "AH0", "K", "OW1", "P", "IY0", "AH0"]
    • Если вы не знакомы с произношением, то Словарь произношения CMU имеет хорошее объяснение и был, как я сгенерировалэтот пример.

Самый простой подход к хранению данных списка, о котором я мог подумать, - просто вывести список в виде строки в кодировке json.Проблема в том, что этот подход, по-видимому, не позволяет использовать полезный индекс для этого столбца.

Вот несколько примеров запросов, которые я хотел бы выполнять очень быстро (с соответствующими данными, проиндексированными в моембаза данных):

  • Найти все произношения, имеющие эту последовательность гласных: ...
  • Найти все произношения, в которых согласная (ые) XXX находятся в позиции (ях) YYY.
  • Найдите все произношения с гласным XXX в позиции last .
  • Найдите все произношения, в которых есть эта последовательность лексических ударений: [0, 2, 1]

Одна из моих идей заключалась в том, чтобы выделить информацию о лексическом ударении (числа справа от каждой гласной фонемы в приведенном выше примере) и сохранить эту информацию отдельно (например, [2, 0,1, 0, 0]), но даже тогда я не уверен, как я мог бы его проиндексировать.

Еще одна идея, которая, по-видимому, по крайней мере решает запросы на лексическое напряжение, может заключаться в хранении всех возможных лексических моделей напряженияяВ отдельной таблице, и затем каждое произношение просто ссылается (через внешний ключ) на один из этих лексических паттернов напряжения.Затем я мог бы запустить свой (Python) серверный код для этого меньшего набора возможных лексических шаблонов стресса, чтобы определить, какие шаблоны соответствовали друг другу, и затем запросить в таблице произношения те произношения, которые имели один из этих шаблонов стресса.Но мне любопытно узнать, есть ли какой-нибудь способ создать более быстрое решение на основе чистого SQL.

Но, чтобы быть ясным: основная проблема, которая меня интересует, - это индексирование и запрос списков фонем.

1 Ответ

0 голосов
/ 13 сентября 2018

Лучшей структурой, вероятно, является таблица с одной строкой на фонему:

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 указано общее количество фонем, это также поможет.

...