Я бы посоветовал не хранить пары. Это привело бы к сложности квадратичного пространства. Если ваши абзацы состоят из 100 слов, то есть примерно 5000 пар слов, поэтому вы должны хранить 5000 записей вместо 100 - увеличение в 50 раз. Скорее, вы могли бы иметь таблицу word
и таблицу text_index
, цель которых - сопоставить слова с абзацами. Примерно так:
create table word (
id int not null auto_increment,
form varchar(100) not null default '',
primary key (id),
unique key (form)
);
create table text_index (
id int not null auto_increment,
word_id int not null default 0,
paragraph_id int not null default 0,
primary key (id),
key (paragraph_id),
key (word_id)
);
В этом минималистском примере идентификаторы параграфа будут генерироваться последовательно при сканировании текстов. Конечно, вы можете уточнить это, например, добавив таблицу document
с идентификаторами документов и сопоставляя абзацы с документами, если вам нужна возможность проследить абзацы до книг.
В основном запрос гласит: «дайте мне все слова и количество слов, которые делят идентификатор абзаца с« цветком »»:
select w.form, count(*) as c
from text_index a
join text_index b on a.paragraph_id = b.paragraph_id
join word w on b.word_id = w.id
where a.word_id = 1
and b.word_id != 1
group by b.word_id;
Вот некоторые примеры данных для игры. Я не проверял запрос на больших наборах данных, но с правильными индексами он должен быть быстрым.
insert into word (form)
values
('flower'),
('toy'),
('candle'),
('red'),
('white'),
('fresh'),
('scented');
insert into text_index (word_id, paragraph_id)
values
(1, 1),
(1, 2),
(1, 3),
(1, 4),
(2, 5),
(2, 6),
(3, 7),
(4, 1),
(4, 2),
(4, 2),
(4, 2),
(4, 3),
(5, 1),
(5, 4),
(5, 8),
(6, 1),
(6, 2),
(7, 4),
(7, 7);