TvoyWeb пишет:Я уже реализовал изначально, что в списке найденных тем ссылки ведут на версию для печати с одновременным поиском по постам. Осталось только в постах поставить ссылки на эти посты в теле самой темы.. ИМХО это самый лучший выход из ситуации.
Ну да согласен, пожалуй тут это наилучший вариант.
Насчет форматы базы индексов. Я просто взял за основу как данные хранятся на этом форуме. Согласен, что получилось не очень оптимально. Наверго лучше взять этот вариант:
TvoyWeb пишет:Файл А.тхт
CODE:А=array (
[арбуз] => 3:1170751460,145:1172161460,
[анаграмма] => 3:1170751460,145:1172161460,
[ананас] => 215:1170751460,314:1172161460
)
Так как тут в дальнейшем можно изменять элементы этого массива если потребуется добавить новые слова или удалить старые. Насчет поиска внутри слова - да это минус такого варианта, слово грамм он не сможет найти в принципе, так как будет искать это слово, в файле Г.txt. Но я думаю, если все остальное было бы в порядке, то этим можно было бы и пожертовать, ведь не часто делаются такие запросы внутри слова. Только я не знаю, можно ли организовать поиск по ключам массива, что бы он нашел слово анаграм.
Тогда кстати можно еще ускорить поиск в массиве, если сделать сортировку по 2 буквам слова, тогда массив будет выглядеть так.
CODE:А=array (
[р]=>array(
[арбуз] => 3:1170751460,145:1172161460
....
),
[н]=>array(
[анаграмма] => 3:1170751460,145:1172161460,
[ананас] => 215:1170751460,314:1172161460
...),
....
)
И искать в этом случае слово арбуз только в массиве $А[р]. Так как в этом последнем массив (а точнее части файла А.txt) будет не более нескольких сот элементов, то его не долго будет перебрать на худой конец и при помощи циклов или регулярных выражений.
TvoyWeb пишет:Поверь я хочу найти простое и правильное решение,
Я понимаю тебя, просто похоже (хорошо, если я ошибаюсь), что в данном случае правильное решение простым не получится и потому думаю о разных вариантах. Ведь в поисковые системы типа поиска Яндекса по своему компьютера вряд ли являются простыми, а междую тем, несмотря на многочасовую индексацию и размер базы индексов в несколько гигабайт, осуществляют поиск всего в течение долей секунды. Свой вариант я придумал по аналогии с орфографическим словарем, где очень много слов, но благодаря тому, что они все отсортированы по алфавиту поиск не занимает много времени, хотя и требует дополнительно знания алфавита.
Твой вариант очень простой, хотя я уже не знаю, что еще там можно ускорить без ущерба для качества поиска.
TvoyWeb пишет:Ни в твоем варианте, ни в моем, если оставить только уникальные слова, сделать этого не получится.
В моем варианте я предполагал, что сначал сначала будут отобраны все посты где одновременно встречаются все слова из поисковой фразы, а потом будут запрошены из основной базы форума эти посты и сделана проверка на точное совпадение фразы. Думаю последнее не займет много времени, так как отобранных постов не будет много.
Кстати, думаю надо бы в поиск в моем и твоем варианте добавить в нескольких частях что-то типа
CODE:$mtime = microtime();
$mtime = explode(' ',$mtime);
$ms=$mtime[0]+$mtime[1];
<код поиска>
$mtime = microtime();
$mtime = explode(' ',$mtime);
$totaltime = round($mtime[1] + $mtime[0] - $ms,4);
$ms=$mtime[1] + $mtime[0];
print '<br>Время работы 1 части поиска:'.$totaltime;
<код поиска>
$mtime = microtime();
$mtime = explode(' ',$mtime);
$totaltime = round($mtime[1] + $mtime[0] - $ms,4);
$ms=$mtime[1] + $mtime[0];
print '<br>Время работы 2 части поиска:'.$totaltime;
....
Что бы в дальнейшем знать какую конкретно часть поиска надо оптимизировать.