WP
^_^
Архитектура нагруженного поисковика
Добрый день. Я работаю под текстовым поисковиком (веб) расчитанным на миллионы страниц, хотел бы поделиться своим и узнать ваше мнение о реализации текстового поиска с учетом морфологии.
На данный момент склоняюсь к такому варианту:
таблица с полями:
unsigned int wid - id псевдо-корня слова,
unsigned int tid - id индексируемого текста,
unsigned int fid - id фрагмента,
unsigned int pos - позиция первого символа текущего фрагмента,
unsigned tinyint length - длинная текущего фрагмента
Индекс на wid+tid.
при внесении (изменении) текста:
Разбить текст на фрагменты (например предложения), затем найти уникальные псевдо-корни слов для каждого из фрагментов и вставить в БД для каждого псевдо-корня ряд в вышеописанной таблице.
При поиске, нужно найти уникальные псевдо-корни слов встречающихся в запросе, и составить запрос:
[sql]SELECT `tid` , SUBSTRING( text, pos, length ) AS `snippet`
FROM `indextable`
LEFT JOIN `texts` ON `indextable`.`tid` = `texts`.`id`
WHERE `wid`
IN (
/*...список id псевдо-корней слов из запроса...*/
)
GROUP BY `fid`
[/sql]
Далее полученный результате нужно склеить.
id псевдо-корня вычисляется в зависимости от морфологического движка, в общем случае им может служить контрольная сумма.
Как считаете насколько такая схема оправдана?
Плюсы:
+ можно находить к примеру синонимы просто присвоив им один wid
+ нет необходимости в дополнительном анализе и выделении фрагментов после выборки
Минусы:
- буду думать как учесть расстояние между словами и их последовательность
Добрый день. Я работаю под текстовым поисковиком (веб) расчитанным на миллионы страниц, хотел бы поделиться своим и узнать ваше мнение о реализации текстового поиска с учетом морфологии.
На данный момент склоняюсь к такому варианту:
таблица с полями:
unsigned int wid - id псевдо-корня слова,
unsigned int tid - id индексируемого текста,
unsigned int fid - id фрагмента,
unsigned int pos - позиция первого символа текущего фрагмента,
unsigned tinyint length - длинная текущего фрагмента
Индекс на wid+tid.
при внесении (изменении) текста:
Разбить текст на фрагменты (например предложения), затем найти уникальные псевдо-корни слов для каждого из фрагментов и вставить в БД для каждого псевдо-корня ряд в вышеописанной таблице.
При поиске, нужно найти уникальные псевдо-корни слов встречающихся в запросе, и составить запрос:
[sql]SELECT `tid` , SUBSTRING( text, pos, length ) AS `snippet`
FROM `indextable`
LEFT JOIN `texts` ON `indextable`.`tid` = `texts`.`id`
WHERE `wid`
IN (
/*...список id псевдо-корней слов из запроса...*/
)
GROUP BY `fid`
[/sql]
Далее полученный результате нужно склеить.
id псевдо-корня вычисляется в зависимости от морфологического движка, в общем случае им может служить контрольная сумма.
Как считаете насколько такая схема оправдана?
Плюсы:
+ можно находить к примеру синонимы просто присвоив им один wid
+ нет необходимости в дополнительном анализе и выделении фрагментов после выборки
Минусы:
- буду думать как учесть расстояние между словами и их последовательность