|
|
|
| Добрый день!
У меня в БД пока ничего нет.
Я просто на странице, где у меня происходит поиск вывел обычный текст и соответственно на этой странице набираю в строке поиска слово, которое есть в этом тексте.
Я понимаю, что похоже делаю что-то не правильно.
Мне текст, которой в будущем возможно прийдётся искать куда мне его загонять в БД?
Весь текст мне нужно заганять или как?
Или мне необходимо каким-то образом индексировать страницу?
Cheops, я Вам очень благодарен за помощь, но могли Вы бы мне детально всё это описать, чтобы у нас не длилась долгая переписка.
Заранее спасибо! | |
|
|
|
|
|
|
|
для: Vados
(15.06.2006 в 11:49)
| | Обычно логика такая:
1) Искать по тексту вы можете только в том случае, если он находится в базе данных.
2) Поэтому весь текст помещается в базу данных.
3) Страницы формируются при помощи запросов SELECT, извлекающих текст из базы данных.
Т.е. следует так построить работу сайта, чтобы весь текст, учавствующий в поиске находился в базе данных - причём желательно в одной таблице. | |
|
|
|
|
|
|
|
для: cheops
(15.06.2006 в 22:49)
| | Хорошо, это понятно, спасибо!
А как же собственно организовать так, чтобы весь текст находился в БД и в одной таблице?
Мне, я так понимаю нужно написать запрос на сохранении всей инфы в таблице?
И ещё такой вопрос, а скорость поиска нужного слова или фразы зависит от того в одной таблице находится текст или нет?
Заранее спасибо за ответ! | |
|
|
|
|
|
|
|
для: Vados
(16.06.2006 в 13:20)
| | Обычно поступают так, делают таблицу разделов, таблицу статей и таблицу параграфов из которых состоят статьи. В результате весь текст у вас будет в таблице параграфов, по которой можно будет производить поиск и восстанавливать какой статье принадлежит параграф, в котором обнаружена искомая фраза. | |
|
|
|
|
|
|
|
для: cheops
(16.06.2006 в 15:17)
| | Хорошо, а как это реализовать?
То есть, если например в параграфе находиться искомое слово, то по уникальному значению ищется название статьи?!
Я правильно понимаю?!
Можете привести пример?
Заранее спасибо! | |
|
|
|
|
|
|
|
для: Vados
(16.06.2006 в 16:00)
| | Да.
>Можете привести пример?
Полный нет, так как код очень громоздкий и требует длительной работы над ним. Вы можете начать работу над такой системой, а в случае возникновения сложностей обращаться на форум за советом. | |
|
|
|
|
|
|
|
для: cheops
(17.06.2006 в 00:35)
| | Хорошо, вот только вопрос с чего начинать?!
Хоть направьте на путь истинный! :-))
Заранее спасибо! | |
|
|
|
|
|
|
|
для: Vados
(19.06.2006 в 12:47)
| | Следует создать таблицы для разделов, статей и параграфов. Затем создать систему администрирования, которая поможет заполнять эти таблицы, т.е. создавать/редактировать/удлять разделы, статьи, наполнять статьи параграфами. Это первоочередная задача, так как если не будет заполненной базы данных будет сложно реализовывать блок представления и поиск.
PS Вообще создание такой системы и поиска подробно описывается в нашей книге "PHP 5. Практика создания Web-сайтов" (более того, на компакт-диске к этой книге имеется готовая система). | |
|
|
|
|
|
|
|
для: cheops
(19.06.2006 в 18:55)
| | Всем привет!
Вот начал разбираться с проблемой поиска, итак что я сделал:
Создал БД search:
в ней имеются 3 таблицы:
таблица artpage
CREATE TABLE 'artpage' (
'id_artpage' mediumint(9) NOT NULL auto_increment,
'name' tinytext NOT NULL,
'id_site' tinyint(4) default NULL,
PRIMARY KEY ('id_artpage')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
|
таблица articles
CREATE TABLE 'articles' (
'id_article' int(11) NOT NULL auto_increment,
'name' tinytext NOT NULL,
'description' tinytext NOT NULL,
'html_title' tinytext NOT NULL,
'html_description' tinytext NOT NULL,
'html_keywords' tinytext NOT NULL,
'pos' mediumint(9) NOT NULL,
'hide' enum('show','hide') default 'show',
'id_page' mediumint(9) NOT NULL,
PRIMARY KEY ('id_article'),
KEY 'id_page' ('id_page'),
FULLTEXT KEY 'name' ('name'),
FULLTEXT KEY 'description' ('description'),
FULLTEXT KEY 'together' ('name','description')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;
|
Заполняю таблицу articles, вот собственно дамп:
INSERT INTO 'articles' ('id_article', 'name', 'description', 'html_title', 'html_description', 'html_keywords', 'pos', 'hide', 'id_page') VALUES (1, 'моя первая статья', 'всем привет, буду рад с каждым познакомиться', 'первая статья', 'статьи о жизни', 'статьи, форум, чат', 1, 'show', 1),
(2, 'моя первая статья', 'всем привет, буду рад с каждым познакомиться', 'первая статья', 'статьи о жизни', 'статьи, форум, чат', 2, 'show', 2),
(3, 'моя третья статья', 'всем привет, буду рад с каждым познакомиться', 'третья статья', 'статьи о жизни', 'статьи, форум, чат', 3, 'show', 3);
|
таблица paragraphes
CREATE TABLE 'paragraphes' (
'id_paragraph' int(10) unsigned NOT NULL auto_increment,
'type' enum('paragraph','title','anchor','table') NOT NULL default 'paragraph',
'name' text NOT NULL,
'url' tinytext NOT NULL,
'picture_big' tinytext NOT NULL,
'picture_small' tinytext NOT NULL,
'place' tinyint(4) NOT NULL default '0',
'pos' int(11) NOT NULL default '0',
'hide' enum('show','hide') NOT NULL default 'show',
'id_article' int(10) unsigned NOT NULL default '0',
PRIMARY KEY ('id_paragraph'),
KEY 'id_article' ('id_article'),
FULLTEXT KEY 'name' ('name')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
|
После этого, хочу найти то, что заполнил в таблице articles, выполняю вот такой SQL-запрос:
SELECT * FROM articles WHERE MATCH(name) AGAINST ('моя первая статья');
Но после такого запроса у меня ничего не выводится из БД?
В чём дело, прошу помогите разобраться!
Заранее спасибо! | |
|
|
|
|
|
|
|
для: Vados
(21.06.2006 в 22:52)
| | По умолчанию полнотекстовый поиск не учитывает слова меньше 4-х симоволов, и которые входят в половину всех записей. Попробуйте
SELECT * FROM articles WHERE MATCH(name) AGAINST ('третья');
|
и запись будет найдена. Снять огарничение вхождения слова в 50% записей можно, если использовать логический режим
SELECT * FROM articles WHERE MATCH(name) AGAINST ('третья' IN BOOLEAN MODE);
|
| |
|
|
|
|
|
|
|
для: cheops
(22.06.2006 в 00:18)
| | Спасибо, получилось!
Буду теперь заниматься реализацией наполнения БД инфо. | |
|
|
|
|
|
|
|
для: Vados
(22.06.2006 в 11:24)
| | Доброй всем ночи!
В книге "PHP5. Практика создания WEB-сайтов", я взял за исходный пример раздел с полноценным поиском, вот что получилось:
<?
include "config.php";
define(LOLIC_OR,1);
define(LOLIC_AND,2);
//Режим поиска
define(TITLES,1);// В названиях
define(ARTICLES,2); // В статьях
//Устанавливаем переменные формы
$name = $_POST['name'];
$numberthemes = $_POST['numberthemes'];
$srchwhere = $_POST['srchwhere'];
$id_page = $_POST['id_page'];
$logic = $_POST['logic'];
?>
<html>
<head>
<body>
<table>
<form action = searchform.php method= "POST">
<tr>
<td>Ключевые слова</td>
<td><input type=text name=name value='<?php echo $name;?>'></td>
</tr>
<tr>
<td>Количество выводимых статей</td>
<td><input type=text name=numberthemes value=
<?php
if(empty($numberthemes)) echo 30;
else echo $numberthemes;
?>></td>
</tr>
<tr>
<td>Искать в</td>
<td>
<select type=text name=srchwhere>
<option value=
<?php
echo TITLES;
if ($srchwhere == TITLES)
echo "checked";
?>>
в названиях статей
<option value=
<?php
echo ARTICLES;
if ($srchwhere == ARTICLES) echo "checked";
?>>в статьях
</select>
</td>
</tr>
<tr>
<td>Группа статей</td>
<td>
<select type=text name=id_page>
<option value=0>Не имеет значения
<?php
//Формируем выпадающий список для выбора раздела поиска
$pgs = mysql_query("SELECT * FROM artpages WHERE hide='show' ORDER BY pos");
if ($pgs)
{
while ($pages = mysql_fetch_array($pgs))
{
if ($pages['id_page'] == $id_page) $strtmp = "selected";
echo $strtmp = "";
echo "<option value=".$pages['id_page']." $strtmp> ".$pages['id_page'];
}
}
?>
</select>
</td>
</tr>
<tr>
<td>Логика</td>
<td>
<input name=logic type=radio value=
<?php
echo LOGIC_AND;
if ($logic == LOGIC_AND) echo "checked";
?>>
ИЛИ<br>
<input name=logic type=radio value=
<?php
echo LOGIC_OR;
if ($logic == LOGIC_OR) echo "checked";
?>>
И</td>
</td>
</tr>
<tr>
<td>
</td>
<td>
<input type=submit name=send value=Найти>
</td>
</tr>
</form>
</table>
<?php
if (!empty($name))
{
// Выбираем логику поиска, если задано несколько ключевых слов
if ($logic == LOGIC_OR) $logstr = "OR";
else $logstr = "AND";
// Разбиваем поисковую фразу на подстроки, разделённые пробелами
$name = trim($name);
$temp = strtok($name, " ");
while ($temp)
{
// Полнотекстовый поиск по столбцу name таблицы articles
// Формируем поисковую часть SQL-запроса, учитывая логику,
// заданную во временной переменной $logic
if ($is_query) $search .= " $logstr MATCH (name) AGAINST ('$temp')";
else $search .= "MATCH (name) AGAINST ('$temp')";
$is_query = true;
$temp = strtok(" ");
}
// Формируем фрагмент SQL-запроса, ответственный за поиск
// в определённом разделе, если значение $id_page не установлено,
// не имеет значение раздел и поиск осуществляется по всем разделам.
if (!empty($id_page)) $pagetmp = "AND id_page = $id_page";
// В зависимости от режима поиска формируем SQL-запрос
switch ($srchwhere)
{
case TITLES: // Поиск в названиях статей
{
// Формируем SQL-запрос
$query = "SELECT * FROM articles WHERE $search AND id_forum = $id_forum AND hide = 'show' $pagetmp ORDER BY time DESC LIMIT $numberthemes";
$src = mysql_query($query);
break;
}
case ARTICLES: // Полнотекстовый поиск по сообщениям
{
// Формируем SQL-запрос
$query = "SELECT id_article FROM paragraphes WHERE $search AND hide = 'show' $pagetmp GROUP BY id_article";
$par = mysql_query($query);
if ($par) puterror("Ошибка при выборе параграфов...");
$numtot = mysql_num_rows($par);
if ($numtot>0)
{
$query = "SELECT * FROM articles WHERE id_article IN (";
while ($art = mysql_fetch_array($par))
{
$query .= $art['id_article'].",";
}
$query .= "0) AND id_forum=$id_forum AND hide = 'show' GROUP BY id_theme ORDER BY time DESC LIMIT $numberthemes";
$src = mysql_query($query);
}
else echo "По запросу ничего не найдено.";
break;
}
}
// Выводим список найденных статей
if ($src) puterror ("Ошибка при выборке статей...");
// Выясняем количество найденных статей
$numtot = mysql_num_rows($src);
if ($numtot>0)
{
while ($art = mysql_fetch_array($src))
{
echo "<a href=art.php?id_article=".$art['id_article'].">".$art['name']."</a><br>";
}
}
else echo "По запросу ничего не найдено.";
}
?>
</body>
</head>
|
Но у меня, при попытке поиска любого слова, MYSQL возвращает значение:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\www\html\search\searchform.php on line 156
По запросу ничего не найдено.
Прошу помогите разобраться.
Заранее спасибо! | |
|
|
|
|
|
|
|
для: Vados
(26.06.2006 в 00:49)
| | Всегда, после выполнения запроса
<?php
$src = mysql_query($query);
?>
|
следует осуществлять проверку
<?php
if(!$src) exit(mysql_error()."<br>".$query);
?>
|
Что теперь пишет? | |
|
|
|
|
|
|
|
для: cheops
(26.06.2006 в 11:01)
| | Хорошо, спасибо!
Но я не пойму куда мне этот код дописывать, точнее после чего?
Заранее спасибо! | |
|
|
|
|
|
|
|
для: Vados
(26.06.2006 в 18:04)
| | После исполнения запроса
$src = mysql_query($query);
В
switch ($srchwhere)
{
case TITLES: // Поиск в названиях статей
{ | |
|
|
|
|
|
|
|
для: Vados
(26.06.2006 в 18:04)
| | >Хорошо, спасибо!
>Но я не пойму куда мне этот код дописывать, точнее после
<?php
case TITLES: // Поиск в названиях статей
{
// Формируем SQL-запрос
$query = "SELECT * FROM articles WHERE $search AND id_forum = $id_forum AND hide = 'show' $pagetmp ORDER BY time DESC LIMIT $numberthemes";
$src = mysql_query($query);
if(!$src) exit(mysql_error()."<br>".$query);
break;
}
?>
|
И так следует обработать каждую функцию mysql_query(). | |
|
|
|
|
|
|
|
для: cheops
(26.06.2006 в 11:01)
| |
<?php
if(!$src) exit(mysql_error()."<br>".$query);
?>
|
Только при отладке.
А так лучше:
<?php
if(!$src) exit(Извините, произошла ошибка. Просим вас связаться с администратором.);
?> | |
|
|
|
|
|
|
|
для: valenok
(26.06.2006 в 18:11)
| | Привет!
Спасибо конечно за совет, но у меня ничего не получается.
Я
<?php
if(!$src) exit(mysql_error()."<br>".$query);
?>
|
поставил, но я так понимаю, что необходимо вставить код без <?php и ?>
Заранее спасибо за помощь. | |
|
|
|
|
|
|
|
для: Vados
(26.06.2006 в 18:53)
| | Без.
Покажите лучше как вы вставили.. | |
|
|
|
|
|
|
|
для: valenok
(26.06.2006 в 18:54)
| | Спасибо!
Но что-то у меня совсем ничего не получается, итак, для ясности, что я сделал:
case TITLES: // Поиск в названиях статей
{
// Формируем SQL-запрос
$query = "SELECT * FROM articles WHERE $search AND id_forum = $id_forum AND hide = 'show' $pagetmp ORDER BY time DESC LIMIT $numberthemes";
$src = mysql_query($query);
if(!$src) exit(mysql_error()."<br>".$query);
break;
}
|
case ARTICLES: // Полнотекстовый поиск по сообщениям
{
// Формируем SQL-запрос
$query = "SELECT id_article FROM paragraphes WHERE $search AND hide = 'show' $pagetmp GROUP BY id_article";
$par = mysql_query($query);
if(!$src) exit(mysql_error()."<br>".$query);
if ($par) puterror("Ошибка при выборе параграфов...");
$numtot = mysql_num_rows($par);
if ($numtot>0)
{
$query = "SELECT * FROM articles WHERE id_article IN (";
while ($art = mysql_fetch_array($par))
{
$query .= $art['id_article'].",";
}
$query .= "0) AND id_forum=$id_forum AND hide = 'show' GROUP BY id_theme ORDER BY time DESC LIMIT $numberthemes";
$src = mysql_query($query);
if(!$src) exit(mysql_error()."<br>".$query);
}
else echo "По запросу ничего не найдено.";
break;
}
|
Вот, то есть получается, что я это ввёл в 3-х местах.
Но у меня при попытке найти искомое слово, вот такая вещь возращается:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND hide = 'show' ORDER BY time DESC LIMIT 1' at line 1
SELECT * FROM articles WHERE MATCH (name) AGAINST ('Привет') AND id_forum = AND hide = 'show' ORDER BY time DESC LIMIT 1
Прошу, помогите мне.
Заранее спасибо. | |
|
|
|
|
|
|
|
для: Vados
(26.06.2006 в 22:03)
| | в таблице articles нет столба id_forum | |
|
|
|
|
|
|
|
для: куч1963
(27.06.2006 в 00:01)
| | Привет!
Хорошо, а что если я уберу вообще в запросе id_forum?
Но тогда у меня при поиске ругается на:
$numtot = mysql_num_rows($src);
То есть в строке браузера выдвётся такая ошибка:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\www\html\search\searchform2.php on line 89
По запросу ничего не найдено.
Помогите, уже сколько мучаюсь ничего не могу сделать! | |
|
|
|
|
|
|
|
для: Vados
(28.06.2006 в 12:57)
| | Я тоже возился с этим листингом, потом взял да сделал так
<?
// Устанавливаем соединение с базой данных
require_once("../admin/config.php");
$title="Поиск";
$id_menu = 9;
include "../util/top.php";
// Режим поиска
define('ARTILES','1'); // В статьях
define('CATALOG','2'); // В КАТАЛОГЕ
define('NEWS','3'); // В NEWS
// Устанавливаем переменные формы
if (!get_magic_quotes_gpc())
{
$_POST['name'] = mysql_escape_string($_POST['name']);
}
$name = $_POST['name'];
$srchwhere = $_POST['srchwhere'];
?>
<p><font size="+1" color="#6699CC">Поиск на сайте</font></p>
<table width="500" border="0" cellpadding="5" cellspacing="0">
<form action=search.php method=post>
<tr>
<td>Ключевые слова</td>
<td><input class="input" type=text name=name value='<?php echo $name; ?>' size="35"></td>
</tr>
<tr>
<td>Искать в</td>
<td>
<select type=text name=srchwhere>
<option value="">Выбор зоны поиска
<option value=
<?php
echo ARTILES;
?>>в статьях
<option value=
<?php
echo CATALOG;
?>>в каталоге
<option value=
<?php
echo NEWS;
?>>в новостях
</select>
</td>
</tr>
<tr><td> </td><td><input class="vvod" type=submit name=send value=Поиск></td></tr>
<input type="hidden" name="scr" value="1"></form>
</table>
<?php
if(isset($_POST['scr']))
{
if(empty($name))
{
echo "<DL><DT>Не введено искомое слово
<DD>Введите поисковое слово и повторите поиск.</DL>";
include "../util/bottom.php";
exit();
}
if(empty($srchwhere))
{
echo "<DL><DT>Не выбрана зона поиска
<DD>Выберите зону поиска и повторите поиск.</DL>";
include "../util/bottom.php";
exit();
}
$name = trim($name);
// В зависимости от режима поиска формируем SQL-запрос
switch($srchwhere)
{
case ARTILES: // Поиск в названиях статей
{
// Формируем SQL-запрос
$query = "select articles.id_article AS id_article,
articles.name AS name,
paragraphes.name AS text,
paragraphes.id_article
from articles, paragraphes
WHERE articles.id_article = paragraphes.id_article AND MATCH(paragraphes.name) AGAINST('$name*' IN BOOLEAN MODE)
GROUP BY articles.id_article";
$post = mysql_query($query);
if($post)
{
$num = mysql_num_rows($post);
if($num>0)
{
echo"
<DL>
<DT>По поисковому запросу: ".$_POST['name']."
<DD>в разделе <b>статьи</b> число соответствий: $num
</DL>
<DL>";
while($posts = mysql_fetch_array($post))
{
echo " <DT><a href=../article/index.php?id_article=".$posts['id_article'].">".$posts['name']."</a><br>";
?>
<DD>Коротко:<br>...<?= strtok (stristr($posts['text'], $_POST['name']),'.');?><br>
<?
}
echo "</DL>";
}
else
{
echo "<DL><DT>По поисковому запросу: ".$_POST['name']." ничего не найдено.
<DD>Попробуйте изменить поисковое слово.</DL>";
include "../util/bottom.php";
exit();
}}
break;
}
case CATALOG: // Полнотекстовый поиск по каталогу
{
// Формируем SQL-запрос
$query = "SELECT * FROM links WHERE MATCH(name) AGAINST('$_POST[name]*' IN BOOLEAN MODE)
GROUP BY name
UNION SELECT * FROM links WHERE MATCH(description) AGAINST('$_POST[name]*' IN BOOLEAN MODE)
GROUP BY name
UNION SELECT * FROM links WHERE MATCH(descr) AGAINST('$_POST[name]*' IN BOOLEAN MODE)
GROUP BY name
";
$post = mysql_query($query);
if($post)
{
$num = mysql_num_rows($post);
if($num>0)
{
echo"
<DL>
<DT>По поисковому запросу: ".$_POST['name']."
<DD>в разделе <b>каталог</b>число соответствий: $num
</DL>
<DL>";
while($posts = mysql_fetch_array($post))
{
echo " <DT><a href=../mag/index.php?pid=".$posts['p_id'].">".$posts['name']."</a><br>";
?>
<DD>Коротко:<br>...<?= $posts['description'];?>
<?
}
echo "</DL>";
}
else
{
echo "<DL><DT>По поисковому запросу: ".$_POST['name']." ничего не найдено.
<DD>Попробуйте изменить поисковое слово.</DL>";
include "../util/bottom.php";
exit();
}
}
break;
}
case NEWS: // Полнотекстовый поиск по новостям
{
// Формируем SQL-запрос
$query = "SELECT * FROM news WHERE MATCH(name) AGAINST('$_POST[name]*' IN BOOLEAN MODE)
GROUP BY name
UNION SELECT * FROM news WHERE MATCH(body ) AGAINST('$_POST[name]*' IN BOOLEAN MODE)
GROUP BY name
";
$post = mysql_query($query);
if($post)
{
$num = mysql_num_rows($post);
if($num>0)
{
echo"
<DL>
<DT>По поисковому запросу: ".$_POST['name']."
<DD>в разделе <b>новости</b> число соответствий: $num
</DL>
<DL>";
while($posts = mysql_fetch_array($post))
{
echo " <DT><a href=../news/index.php?id_news=".$posts['id_news'].">".$posts['name']."</a><br>";
?>
<DD>Коротко:<br>...<?= $posts['body'];?>
<?
}
echo "</DL>";
}
else
{
echo "<DL><DT>По поисковому запросу: ".$_POST['name']." ничего не найдено.
<DD>Попробуйте изменить поисковое слово.</DL>";
include "../util/bottom.php";
exit();
}
}
break;
}
}
}
include "../util/bottom.php";
?>
|
| |
|
|
|
|