|
|
|
| Есть БД в mysql корпоративной поисковой системы. (с ней работает десктопная программа - каким образом х.з.)
в БД есть таблица - поисковый индекс (5млн строк) в индексе просто слова по порядку из каждого документа собраны
таблица index
стообцы:
word_id - слово (текст)
doc_id - номер документа
word_pos - смещение слова от начала документа (байт)
Мне нужно как то найти документы в которых встречается несколько заданных слов подряд к примеру слово1+слово2+слово3
Есть БД в mysql корпоративной поисковой системы. (с ней работает десктопная программа - каким образом х.з.)
в БД есть таблица - поисковый индекс (5млн строк) в индексе просто слова по порядку из каждого документа собраны
таблица index
стообцы:
word_id - слово (текст)
doc_id - номер документа
word_pos - смещение слова от начала документа (байт)
Мне нужно как то найти документы в которых встречается несколько заданных слов подряд к примеру слово1+слово2+слово3
Господа я уже отчаился., реально ли это сделать вообще?!
десктопная программа же как то по этому индексу ищет причем весьма шустро...
Сейчас поиск сделал просто по наличию всех слов в документе, но в результате выдает чуш!!!
важен именно порядок слов... (чтобы они были как в запросе)
десктопная софтина под винду как то еще ражирует результат в зависимости от расстояний между словами.,
то есть при поиске по запросу слово1+слово2:
вначале выдает документы содержащие слово1+слово2, потом слово1+ххх+слово2, потом слово1+ххх+ххх+слово2., но на это я уже забил хотябы точные вхождения бы найти... | |
|
|
|
|
|
|
|
для: Serj0002
(22.03.2012 в 02:05)
| | // ОТВЕЧАЮ САМ СЕБЕ - хранить слова в таком виде явно беспонтовая идея
// (за что спасибо разработчикам БД)
// Плоды бессоннной ночи -> уродливый тормозной запрос
// работает выводит все документы по рейтингу средней близости слов
// выводит список документов + в добавок еще склеивает слова так чтобы можно было
// прочитать что найдено ...
SELECT rating.pid, GROUP_CONCAT(`b` SEPARATOR ' ') as `w` FROM
(
SELECT
t1.pid,
avg(t2.s-t1.s) as avg_s
FROM
index AS t1,
index AS t2
WHERE t1.s < t2.s
AND t1.pid=t2.pid /* в одном документе */
AND t1.w="Но" /* Слово1 */
AND t2.w="," /* Слово2 */
GROUP BY pid
order by avg_s
) as rating,
index
where index.pid=rating.pid
GROUP BY pid
// Может... может можно как то лучше (на локальном запрос 1,5 ссекунды выполняется )
// а на загруженном серваке... мне кажется вообще все повиснет
// в запросе описанно только последовательность 2х слов... (я предпологаю формировать
// запрос динамически на пхп из всего что ввел пользователь в форму поиска)
// => каждое слово в поисковом запросе будет стоить серваку перелопачивания
// дополнительно подклеенной таблицы
// ппц ПОДСКАЖИТЕ КАК ОПТИМИЗИРОВАТЬ ЗАПРОС?!
// кто с подобной структурой хранения данных сталкивался.... | |
|
|
|
|
|
|
|
для: Serj0002
(22.03.2012 в 04:27)
| | обычно полнотекстовым поиском пользуются | |
|
|
|
|
|
|
|
для: Valick
(22.03.2012 в 04:45)
| | у меня база - есть данность и структуру ее менять низя )
Сделал нормальные индексы - не так уж все и плохо
тестовая база (542502 строки) - время запроса 0.397 s
На компе CPU 500мгц оперативка 256мег (виртуалка)
542502 строки соответствуют ~1000 страниц текста
Тормозновато конечно.
Я вообще с текстовым поиском никогда не работал.,
Подскажите знающие люди, если использовать FULLTEXT индексы, или в Sphinx, при сохранении того же функционала (ражирование результатов) прирост скорости будет?
Просто пытаюсь понять имеет ли смысл эту базу перенести в паралельную где текст хранится в человеческом виде... специально для поиска. (будет ли толк от этого или только сервак по мощнее спасет) | |
|
|
|
|
|
|
|
для: Serj0002
(22.03.2012 в 05:38)
| | попробуйте :) | |
|
|
|
|
|
|
|
для: Valick
(22.03.2012 в 08:54)
| | СПАСИБО; ЗАПРОС НЕМНОГО ПОДПРАВИЛ;теперь в 5млн строк ищет за тысячные секунды.... не хуже сфинкса)) написал индексатор для построения таких индексов со стримером портера... тема закрыта.
p.s. похоже мне нужен блог.. | |
|
|
|