Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

Пользователей: 13,368
новичок: Goosprin
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Меры близости на векторах в Delphi + Блок схемы
Диплом - база данных поставщиков на Delphi (MS Sql Server)+ Пояснительна...
Движение шарика в эллиптическои параболоиде на Delphi [OpenGL] + Блок схемы

Собираем поисковый механизм на PHP/MySQL
Денис Рощин
denis@komkon.org

"Основная проблема ЭВМ -
Вводишь мусор, получаешь мусор"
Дик Фейнман

Итак, у вас полностью динамический сайт, на котором находится большое количество различных данных (любого вида - форумы, статьи и т.п.). Преимущественно большие данные хранятся в BLOBах (чего и вам наверное не удалось избежать), следовательно невозможно сделать ничего полезного, используя стандартный вид запроса LIKE %searchword% так как вывод не будет соответствующим (то есть релевантным).

Должен быть другой путь. И он есть :-).
Шаг один: Редукция "посторонних" слов из blob'а

Первая проблема заключается в том, что данные переполнены посторонними словами (предлогами, междометиями..), такими как "как, где, а, и". Эти слова помогают нам, людям, общаться но не имеют ничего общего с нашей проблемой, когда нужно получить вывод по релевантности.

Ниже, в конце статьи, я приложил мой личный список таких, "посторонних", слов.

Итак, мы сейчас пытаемся сделать - выбрать из данных эти слава, и, - в ново созданной табличке с двумя полями: словом и его указателем (счетчиком). Нам необходимо что-то вроде такого:
+-----+---------------+
| qid | word |
+-----+---------------+
| 6 | links |
| 5 | Fire |
| 5 | topics |
| 5 | related |
| 5 | Shakespeare |
| 4 | people |
| 4 | Knowpost |
| 3 | cuba |
| 3 | cigar |
+-----+---------------+

Так, давайте создадим собственно табличку:
CREATE TABLE search_table(
word VARCHAR(50),
qid INT)

Следующим шагом будет - обработать и переместить данные в нашу таблицу search_table.
$query = "SELECT blob,identifier FROM your_table";
$result = mysql_query($query);
$number = mysql_numrows($result);
$j = 0;
WHILE ($j < $number) {

/* Наш "blob" */
$body = mysql_result($result,$j,"blob");

/* Наш "identifier */
$qid = mysql_result($result,$j,"qid");

/* Открыть файл с посторонними словами в массив */

$noise_words = file("noisewords.txt");
$filtered = $body;

/* Помещаем пробел перед первым словом */
$filtered = ereg_replace("^"," ",$filtered);

/* Теперь мы избавились от ненужных слов и
можем поместить то, что осталось - в массив
*/

/* Пробегаем циклом и удаляем неправильные слова */
for ($i=0; $i < count($noise_words); $i++) {
$filterword = trim($noise_words[$i]);
$filtered =
eregi_replace(" $filterword "," ",$filtered);
}

$filtered = trim($filtered);
$filtered = addslashes($filtered);
$querywords = ereg_replace(",","",$filtered);
$querywords = ereg_replace(" ",",",$querywords);
$querywords = ereg_replace("\?","",$querywords);
$querywords = ereg_replace("\(","",$querywords);
$querywords = ereg_replace("\)","",$querywords);
$querywords = ereg_replace("\.","",$querywords);
$querywords = ereg_replace(",","','",$querywords);
$querywords = ereg_replace("^","'",$querywords);
$querywords = ereg_replace("$","'",$querywords);

/* Теперь мы должны иметь что-то типа
'Word1','Word2','Word3'
так что теперь мы можем загнать все в массив
*/
$eachword = explode(",", $querywords);

/* наконец-то мы можем пробежаться по
массиву и поместить каждое слово в базу данных,
вместе со счетчиком
*/

for ($k=0; $k < count($eachword); $k++) {
$inputword = "INSERT INTO search_table
VALUES($eachword[$k],$qid)";
mysql_query($inputword);
}

/* Пробежаться по циклу еще разок с новыми данными */
$j++;
}

?>

Этот скрипт обрабатывает ваши старые данные. Необходимо добавить подобную же обработку на добавление данных в вашу базу данных (когда её вводит пользователь, хозяин - или кто угодно) - так, чтобы база обновлялась в процессе.
Шаг два: Поиск в таблице

Теперь мы имеем таблицу с ключевыми словами и счетчиками. Как собрать запрос?

Во-первых, необходимо переформатировать (нет, не жесткий диск) - слова поиска в строку вида 'word1','word2','word3' и записать её в $querywords.

Далее использовать подобный ниже следующему запрос:
SELECT count(search_table.word) as score, search_table.qid,your_table.blob
FROM search_table,your_table
WHERE your_table.qid = search_table.qid AND search_table.word
IN($querywords)
GROUP BY search_table.qid
ORDER BY score DESC";

Вывод же может быть, например, таким:

$getresults = mysql_query($search);
$resultsnumber = mysql_numrows($getresults);

IF ($resultsnumber == 0) {

PRINT "Ничего не найдено. "
."Попробуйте использовать другие ключевые слова.";

} ELSEIF ($resultsnumber > 0) {

PRINT "Поиск вернул $resultsnumber результатов
"
."Расположение по релевантности

";
for($count = 0; $count < $resultsnumber; $count++) {
$body = mysql_result($getresults,$count,"blob");
$qid = mysql_result($getresults,$count,"qid");

$body2print = substr($body, 0, 100);
$cnote = $count+1;
PRINT "$cnote.
";
}
}

?>

Итак, у вас есть механизм поиска по ключевым словам в вашей базе данных по релевантности (актуальности запросу).

Конечно, это не Yandex и не Google :-))).

Но у нас теперь есть небольшой поисковый механизм, который вполне быстро и грамотно работает и вполне подходит обычному пользователю (который не собирается использовать логические элементы и т.п.).

Вот лист моих "посторонних" слов:
noisewords.txt
--------------
a
about
after
ago
all
almost
along
also
am
an
and
answer
any
anybody
anywhere
are
aren't
around
as
ask
at
bad
be
been
before
being
best
better
between
big
but
by
can
can't
come
could
couldn't
day
did
didn't
do
does
don't
down
each
either
else
even
ever
every
everybody
everyone
far
find
for
found
from
get
go
going
gone
good
got
had
has
have
haven't
having
her
here
hers
him
his
home
how
href
I
if
in
into
is
isn't
it
its
know
large
less
like
little
looking
look
many
me
more
most
must
my
near
never
new
news
no
none
not
nothing
of
off
often
old
on
once
only
or
other
our
ours
out
over
page
please
question
rather
recent
she
should
sites
small
so
some
something
sometime
somewhere
than
true
thank
that
the
their
theirs
them
then
there
these
they
this
those
though
through
thus
time
times
to
too
under
until
untrue
up
upon
use
users
version
very
via
want
was
way
web
were
what
when
where
which
who
whom
whose
why
wide
will
with
within
without
world
worse
worst
would
www
yes
yet
you
your
yours
Опубликовал Kest November 06 2008 15:51:03 · 0 Комментариев · 5953 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
начисление процен...
Игра PackMan
Работа с картотеками
Советы от Даниилы...
MPTools
Borland C++Builde...
Pro-Download Sys...
Программа предназ...
Алгоритм DES шифр...
Керниган Б.В., Ри...
Tetris 2002
Модифицированная ...
Редактор анимаций
DCAVI
Preview
Delphi. Разработк...
SMLPack v1.0
Разработка клиент...
Язык программиров...
3D Тетрис [Исходн...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97833
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10291
Turbo Pascal fo... 7373
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Простейший пример ...
Размер фотографий ...
ОБРАЗОВАНИЕ ПЛОТНО...
Интерфейс модели в...
Промокоды в игрово...
Невозможность созд...
Недостатки рекурси...
Выполнение обновле...
6.3. Принципы
Указания.
Типы данных. Общие...
Локальные сети с ш...
Применение вспышки...
Функции to_string(...
Анализ результатов...
Табулирование функ...
Элемент ввода radi...
Интернет-магазины ...
1хбет казино
Элементы USB
Настройка меню “Пуск”
Простейшие алгорит...
Облегчайте переход
Динамические масси...
ПРИЛОЖЕНИЕ D. ПРО...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?