|
|
|
|
|
для: Лена
(07.10.2008 в 16:37)
| | если я правильно понял задачу: создать поисковую систему по файлам своего сайта, учитывающую словоформы, то я бы сделал так (хотя поиск по файлам - это геморой, лечше все делать в базе):
//... тут цикл по массиву с адресами файлов
$data=strip_tags(file_get_contents($filename));
preg_match_all ("/искомое/", $data, $matches);
$ar[$filename]=sizeof(@$matches[0]) ;
|
после этого массив сортируется по значениям и с одного его конца в ключах оказываются адреса (имена файлов) наиболее релевантных страниц, а сдругого - наименее.
Перед началом поиска само искомое, конечно, можно пропустить через stemmer. А для нескольких слов (при необходимости поиска по многословному запросу), вообще, сначала в массив, элементы массива на обработку, потом из массива:
$stemmer = new Lingua_Stem_Ru();
$string='искомое';
$data=preg_split("/[\s,\.!\?\:]+/",$string,-1,PREG_SPLIT_NO_EMPTY);
$i=sizeof($data);
for($i;$i>=0;$i--){
$data[$i]=$stemmer->stem_word($data[$i]);
}
$string=implode(" ", $data);
|
| |
|
|
|
|
|
|
|
для: Евгений Т.
(22.11.2010 в 20:46)
| | Почему же Вы сами не последовали собственному совету?
Затевать здесь дискуссию по указанным Вами моментам было бы жестким оффтопиком вкупе с явным нарушением правил.
Ответить Вам приватным письмом возможнолсти не представляется по той же причине, что и автору вопроса.
Вы не указали е-мэйл в профиле, а значит ни письмо автору реплики написать, ни ответить на его личное сообщение не получится.
Так что если хотите подкрепить свои доводы аргументами, сперва заполните профиль. | |
|
|
|
|
|
|
|
для: Trianon
(21.11.2010 в 16:15)
| | Учитесь прощать другим их ошибки.
Каждый когда-то был новичком. Поэтому когда кто-то допускает ошибку - будь это опечатка в слове, неосторожный флейм, глупый вопрос или неоправданно длинный ответ - будьте к этому снисходительны. Даже если руки чешутся ответить, подумайте дважды.
Если Вы обладаете хорошими манерами, это еще не значит, что Вы имеете лицензию на преподавание этих манер всем остальным. Если же Вы решили обратить внимание пользователя на его/ее ошибку, сделайте это корректно и лучше не в конференции, а в частном письме. Дайте людям возможность посомневаться. И не будьте высокомерным и надменным. Как известно, исправления в тексте часто тоже содержат грамматические ошибки; также и указание на несоблюдение правил, бывает, демонстрирует нарушение этого же форума. | |
|
|
|
|
|
|
|
для: Trianon
(21.11.2010 в 16:15)
| | >Почему Вы считаете себя вправе грузить на рассмотрение код, в котором не расставлены отступы согласно вложенным составным операторам?
>Вы полагаете, что расставлять их за Вас приятное и веселое занятие?
>Почему первой исполняемой строкой скрипта не стоит error_reporting(E_ALL); ?
>Вы возможно уже настолько опытны, что предупреждений php Вам видеть не нужно.
>Мы же тут все сплошь новички, и догадываться о том, что нехорошего тихо происходит у Вас в коде, совершенно не хотим.
Знаете, я думал этот форум создан, чтобы помогать новичкам, видимо ошибался.
Спасибо всем, кто помог. мой вопрос закрыт. | |
|
|
|
|
|
|
|
для: uvajs
(21.11.2010 в 09:17)
| | >>//tags.tag НЕ ДОЛЖНО ВЫТЯГИВАТЬСЯ В ГРУППИРУЮЩЕМ ЗАПРОСЕ
>Теги выводятся нормально.
Ответ неверный. Мне (как и Лене) не интересно, как они выводятся.
Мне интересно, чтобы в исходном тексте не было кода, афтор которого не понимает, как он работает.
А этот код помимо всего прочего, еще и формально некорректный.
>> //ЗАЧЕМ ЗДЕСЬ <li> </li>? ЛУЧШЕ ЭТИ ТЕГИ ПЕРЕНЕСТИ В МЕСТО НЕПОСРЕДСТВЕННОГО ВЫВОДА ОШИБКИ
>Я сначала заношу ошибки в переменную: $log, потом если же есть ошибки в нижу есть вывод.
Ответ неверный. <li></li> сами по себе об шибках не говорят ничего. Заносить их не требуется.
.
>>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ stripslashes. ЗАЧЕМ ВЫ ЕЕ ИСПОЛЬЗУЕТЕ?
>Чтобы убрать кавычки ("").
Ответ неверный. Эта функция никакие кавычки не убирает. Кстати, зачем Вам убирать кавычки? Чем они Вам не угодили в сравнении с другими буквами, знаками, цифрами?
>>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ htmlspecialchars. ЕСТЬ ЛИ СМЫСЛ ЕЕ ЗДЕСЬ ИСПОЛЬЗОВАТЬ?
>Чтобы заменить <> на такие мнимоники <>
Что еще за мнемоники? кому они улучшают память?
Зачем менять символы на мнемоники? Чем символы плохи?
>>//ГДЕ В ЗАПРОСЕ ЗАЩИТА ОТ SQL-ИНЪЕКЦИЙ?
>Писать защищенные запросы я пока не умею так, как еще слаб в PHP.
Писать Вы никакие запросы не умеете, однако ж пытаетесь.
>>//ЭТО ЗАЧЕМ? ВЫ ЕГО ГДЕ-ТО ПОТОМ ИСПОЛЬЗУЕТЕ?
>Если есть ошибки, заношу их в массив в переменную $log...
>>Я - пользователь. Вбила в форму слово "урок" - мне надо найти все фразы, в которых есть это слово + фразы, где есть "урока, уроков".
>Я нажала на кнопку. Дальше начинает работать скрипт, который вы написали.
>Да все Правильно!
>
>>Скрипт будет искать все эти слова в базе или в файлах?
>Да, в поле TEXT
Ответ неверный.
В базе или в файле?
ни у базы, ни у файлов полей нет!
У меня к Вам отдельная порция вопросвов.
Почему Вы считаете себя вправе грузить на рассмотрение код, в котором не расставлены отступы согласно вложенным составным операторам?
Вы полагаете, что расставлять их за Вас приятное и веселое занятие?
Почему первой исполняемой строкой скрипта не стоит error_reporting(E_ALL); ?
Вы возможно уже настолько опытны, что предупреждений php Вам видеть не нужно.
Мы же тут все сплошь новички, и догадываться о том, что нехорошего тихо происходит у Вас в коде, совершенно не хотим. | |
|
|
|
|
|
|
|
для: Лена
(21.11.2010 в 00:14)
| | >//tags.tag НЕ ДОЛЖНО ВЫТЯГИВАТЬСЯ В ГРУППИРУЮЩЕМ ЗАПРОСЕ
Теги выводятся нормально.
> //ЗАЧЕМ ЗДЕСЬ <li> </li>? ЛУЧШЕ ЭТИ ТЕГИ ПЕРЕНЕСТИ В МЕСТО НЕПОСРЕДСТВЕННОГО ВЫВОДА ОШИБКИ
Я сначала заношу ошибки в переменную: $log, потом если же есть ошибки в нижу есть вывод.
>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ stripslashes. ЗАЧЕМ ВЫ ЕЕ ИСПОЛЬЗУЕТЕ?
Чтобы убрать кавычки ("").
>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ htmlspecialchars. ЕСТЬ ЛИ СМЫСЛ ЕЕ ЗДЕСЬ ИСПОЛЬЗОВАТЬ?
Чтобы заменить <> на такие мнимоники <>
>//ГДЕ В ЗАПРОСЕ ЗАЩИТА ОТ SQL-ИНЪЕКЦИЙ?
Писать защищенные запросы я пока не умею так, как еще слаб в PHP.
>//ЭТО ЗАЧЕМ? ВЫ ЕГО ГДЕ-ТО ПОТОМ ИСПОЛЬЗУЕТЕ?
Если есть ошибки, заношу их в массив в переменную $log...
>Я - пользователь. Вбила в форму слово "урок" - мне надо найти все фразы, в которых есть это слово + фразы, где есть "урока, уроков".
Я нажала на кнопку. Дальше начинает работать скрипт, который вы написали.
Да все Правильно!
>Скрипт будет искать все эти слова в базе или в файлах?
Да, в поле TEXT | |
|
|
|
|
|
|
|
для: heed
(20.11.2010 в 21:13)
| | _ | |
|
|
|
|
|
|
|
для: uvajs
(20.11.2010 в 18:32)
| | Я в вашем скрипте справа написала вопросы - это ваши самые грубые ошибки. Вообще скрипт лучше не использовать или переписать, очень плохо написан.
<?php
<?
session_start();
include ("block/bd.php");
//tags.tag НЕ ДОЛЖНО ВЫТЯГИВАТЬСЯ В ГРУППИРУЮЩЕМ ЗАПРОСЕ
$cloudData = mysql_query("SELECT tags.tag, tags.id, COUNT(posts_tags.tagid) AS posts_count
FROM posts_tags
LEFT JOIN tags ON posts_tags.tagid = tags.id
GROUP BY tags.id;",$db);
if (mysql_num_rows($cloudData) == 0) {
$tagcloud = false;
} else {
$tagcloud = array();
while ($resCloudData = mysql_fetch_array($cloudData)){//ВАМ НУЖНО, ЧТОБЫ РЕЗУЛЬТАТ ЗАПРОСА ВЕРНУЛ ТОЛЬКО АССОЦИАТИВНЫЙ МАССИВ.
//КАКУЮ ФУНКЦИЮ НАДО ИСПОЛЬЗОВАТЬ?
$tagcloud[] = $resCloudData;
}
}
if (isset($_POST['submit_s']))
{
$submit_s = $_POST['submit_s'];
}
if (isset($_POST['search']))
{
$search = $_POST['search'];
}
$log =="";
$error="no"; //флаг наличия ошибки
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title><?php echo "Информация по запросу - $search" ?></title> //ПОЧЕМУ ПЕРЕД ВЫВОДОМ В БРОУЗЕР НЕ ПРОИСХОДИТ ОБРАБОТКА СТРОК?ЧЕМ НУЖНО ОБРАБАТЫВАТЬ?
<link href="style.css" rel="stylesheet" type="text/css">
<link href="style2.css" rel="stylesheet" type="text/css">
<meta name="keywords" content="<?php echo $myrow["meta_k"];?>"> //ТО ЖЕ САМОЕ...
<meta name="description" content="<?php echo $myrow["meta_d"];?>"> //ТО ЖЕ САМОЕ...
<script type="text/javascript" src="js/swfobject.js"></script>
<script language="JavaScript" src="js/crumb.js"></script>
<link rel="icon" href="http://engells.com/favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="http://engells.com/favicon.ico" type="image/x-icon">
</head>
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<?php include("block/header.php");?>
</tr>
<tr>
<td><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<?php include("block/left_td.php"); ?>
<td valign="top">
<?php
if (isset($submit_s))
{
if (empty($search) or strlen($search) <= 2)
{
$log .= "<li>Поисковый запрос не введен, либо он менее 4-х символов.</li>"; //ЗАЧЕМ ЗДЕСЬ <li> </li>? ЛУЧШЕ ЭТИ ТЕГИ ПЕРЕНЕСТИ В МЕСТО НЕПОСРЕДСТВЕННОГО ВЫВОДА ОШИБКИ
$error = "yes";
}
$search = trim($search);
$search = stripslashes($search); //ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ stripslashes. ЗАЧЕМ ВЫ ЕЕ ИСПОЛЬЗУЕТЕ?
$search = htmlspecialchars($search);//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ htmlspecialchars. ЕСТЬ ЛИ СМЫСЛ ЕЕ ЗДЕСЬ ИСПОЛЬЗОВАТЬ?
}
else
{
$log .= "<li>Вы обратились к файлу без необходимых параметров.</li>"; //И ОПЯТЬ ФРАЗУ БЕРЕТЕ В <li>... К КАКОМУ ФАЙЛУ ВЫ ОБРАЩАЕТЕСЬ? ЗАЧЕМ ВАМ ЭТОТ ФАЙЛ?
$error = "yes";
}
if($error=="no")
{
//ГДЕ В ЗАПРОСЕ ЗАЩИТА ОТ SQL-ИНЪЕКЦИЙ?
$result1 = mysql_query("SELECT *
FROM data
WHERE MATCH(text) AGAINST('$search')",$db);
if (@mysql_num_rows($result1) > 0 ) //К ЧЕМУ ЗДЕСЬ @? ДЛЯ ЧЕГО СЛУЖИТ ЭТОТ СИМВОЛ?
{
$myrow1 = mysql_fetch_array($result1); //ВАМ НУЖНО, ЧТОБЫ РЕЗУЛЬТАТ ЗАПРОСА ВЕРНУЛ ТОЛЬКО АССОЦИАТИВНЫЙ МАССИВ. КАКУЮ ФУНКЦИЮ НАДО ИСПОЛЬЗОВАТЬ?
do //ВМЕСТО do {...} while () НАДО ИСПОЛЬЗОВАТЬ
{ // while ($myrow1 = mysql_fetch_array($result1)){printf (...)}
printf ("<div class='content3'>
<a href='lessons.php?rub=%s&id=%s'>
<img src='%s' class='mini_img' align='left' alt='*'></a>
<p class='h4'><a href='lessons.php?rub=%s&id=%s'>%s</a></p>
<p class='comment1'>Автор/Переводчик: %s</p><br clear='left'>
<span>%s</span><br>
<div class='line_f'> </div>
<span class='comment1'>Добавлен: %s</span>
<span class='comment1'>Просмотров: %s</span></div></div>
</div>
</div></div>",$myrow1["rub"], //ПОЧЕМУ ПЕРЕД ВЫВОДОМ В БРОУЗЕР НЕ ПРОИСХОДИТ ОБРАБОТКА СТРОК? КАКОЙ ФУНКЦИЕЙ НУЖНО ОБРАБАТЫВАТЬ?
$myrow1["id"],
$myrow1["mini_img"],
$myrow1["rub"],
$myrow1["id"],
$myrow1["title"],
$myrow1["author"],
$myrow1["description"],
$myrow1["date"],
$myrow1["view"]);
}
while ($myrow1 = mysql_fetch_array($result1)); //ВАМ НУЖНО, ЧТОБЫ РЕЗУЛЬТАТ ЗАПРОСА ВЕРНУЛ ТОЛЬКО АССОЦИАТИВНЫЙ МАССИВ. КАКУЮ ФУНКЦИЮ НАДО ИСПОЛЬЗОВАТЬ?
}
else
{
echo "<p>Информация по Вашему запросу на сайте не найдена!</p>";
}
}
else//если ошибки есть
{
$log = "<font color=#cc0000><strong></strong></font></p><ul style='font-family:Verdana; font-size:12px; border:2px solid #cc0000; padding:10px; margin:20px; width:570px;'>".$log."</ul>";
//Отправляем результат в массив
$GLOBALS['_RESULT'] = array( //ЭТО ЗАЧЕМ? ВЫ ЕГО ГДЕ-ТО ПОТОМ ИСПОЛЬЗУЕТЕ?
'error' => 'yes',
'er_mess' => $log);
echo "<div align='center'>$log</div>";
}
?>
</td>
<?php include("block/right_td.php");?>
</tr>
</table></td>
</tr>
<tr>
<?php include("block/footer.php");?>
</tr>
</table>
</body>
</html>
|
По основной проблеме.
Я - пользователь. Вбила в форму слово "урок" - мне надо найти все фразы, в которых есть это слово + фразы, где есть "урока, уроков".
Я нажала на кнопку. Дальше начинает работать скрипт, который вы написали. Скрипт будет искать все эти слова в базе или в файлах?
Если в базе - в каких полях базы должен производиться поиск?
Если в файлах - что содержится в этих файлах? | |
|
|
|
|
|
|
|
для: uvajs
(20.11.2010 в 18:32)
| | ни php, ни regexp'ы в вашем коде не влияют на результаты поиска.
и тем более если хотите чтобы запрос возвращал только то что нужно (всмысле без получения абсолютно всех записей и поиска средствами php)
читайте о возможностях fulltext-поиска, в частности
SELECT ..... WHERE MATCH (.....) AGAINST ('......' IN BOOLEAN MODE);
заряжайте в запрос только корни искомых слов с операторами усечения (*),если хотите выжать как можно больше из возможностей
а лучше просто предоставьте пользователям выдирать логику OR|AND и добавлять эти самые операторы.
//кстати всё-же лучше с SQL_CALC_FOUND_ROWS и LIMIT
и
>
if (empty($search) or strlen($search) <= 2)
{
$log .= "<li>Поисковый запрос не введен, либо он менее 4-х символов.</li>";
$error = "yes";
}
$search = trim($search);
$search = stripslashes($search);
$search = htmlspecialchars($search);
|
несколько не то
///// опять-же читайте про fulltext и разбирайтесь что должно или не должно попадать в этот запрос | |
|
|
|
|
|
|
|
для: Лена
(20.11.2010 в 00:32)
| | На данный момент этот скрипт ищет только точных совпадений. Как сделать так, чтобы скрипт искал не только совпадений к примеру: пользователь вводит Урок, чтобы скрипт выводит статьи где встречаются слова: Урок, Уроки, Уроков и тд. т.е. похожих слов тоже.
поисковая форма:
<form action="search.php" method="post" name="form_s">
<div align="center" style="margin-top:10px;"><img src="images/search.jpg" width="118" height="96"></div><br>
<div align="center"><span class="search_text">Поисковый запрос:<br><input name="search" type="text" size="25" maxlength="40" class="search_imput"></span></div>
<div align="center"><input class="formbutton" name="submit_s" type="submit" value="Искать"></div></form>
|
и обработчик:
<?
session_start();
include ("block/bd.php");
$cloudData = mysql_query("SELECT tags.tag, tags.id, COUNT(posts_tags.tagid) AS posts_count
FROM posts_tags
LEFT JOIN tags ON posts_tags.tagid = tags.id
GROUP BY tags.id;",$db);
if (mysql_num_rows($cloudData) == 0) {
$tagcloud = false;
} else {
$tagcloud = array();
while ($resCloudData = mysql_fetch_array($cloudData)){
$tagcloud[] = $resCloudData;
}
}
if (isset($_POST['submit_s']))
{
$submit_s = $_POST['submit_s'];
}
if (isset($_POST['search']))
{
$search = $_POST['search'];
}
$log =="";
$error="no"; //флаг наличия ошибки
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title><?php echo "Информация по запросу - $search" ?></title>
<link href="style.css" rel="stylesheet" type="text/css">
<link href="style2.css" rel="stylesheet" type="text/css">
<meta name="keywords" content="<?php echo $myrow["meta_k"];?>">
<meta name="description" content="<?php echo $myrow["meta_d"];?>">
<script type="text/javascript" src="js/swfobject.js"></script>
<script language="JavaScript" src="js/crumb.js"></script>
<link rel="icon" href="http://engells.com/favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="http://engells.com/favicon.ico" type="image/x-icon">
</head>
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<?php include("block/header.php");?>
</tr>
<tr>
<td><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<?php include("block/left_td.php"); ?>
<td valign="top">
<?php
if (isset($submit_s))
{
if (empty($search) or strlen($search) <= 2)
{
$log .= "<li>Поисковый запрос не введен, либо он менее 4-х символов.</li>";
$error = "yes";
}
$search = trim($search);
$search = stripslashes($search);
$search = htmlspecialchars($search);
}
else
{
$log .= "<li>Вы обратились к файлу без необходимых параметров.</li>";
$error = "yes";
}
if($error=="no")
{
$result1 = mysql_query("SELECT *
FROM data
WHERE MATCH(text) AGAINST('$search')",$db);
if (@mysql_num_rows($result1) > 0 )
{
$myrow1 = mysql_fetch_array($result1);
do
{
printf ("<div class='content3'>
<a href='lessons.php?rub=%s&id=%s'>
<img src='%s' class='mini_img' align='left' alt='*'></a>
<p class='h4'><a href='lessons.php?rub=%s&id=%s'>%s</a></p>
<p class='comment1'>Автор/Переводчик: %s</p><br clear='left'>
<span>%s</span><br>
<div class='line_f'> </div>
<span class='comment1'>Добавлен: %s</span>
<span class='comment1'>Просмотров: %s</span></div></div>
</div>
</div></div>",$myrow1["rub"],
$myrow1["id"],
$myrow1["mini_img"],
$myrow1["rub"],
$myrow1["id"],
$myrow1["title"],
$myrow1["author"],
$myrow1["description"],
$myrow1["date"],
$myrow1["view"]);
}
while ($myrow1 = mysql_fetch_array($result1));
}
else
{
echo "<p>Информация по Вашему запросу на сайте не найдена!</p>";
}
}
else//если ошибки есть
{
$log = "<font color=#cc0000><strong></strong></font></p><ul style='font-family:Verdana; font-size:12px; border:2px solid #cc0000; padding:10px; margin:20px; width:570px;'>".$log."</ul>";
//Отправляем результат в массив
$GLOBALS['_RESULT'] = array(
'error' => 'yes',
'er_mess' => $log);
echo "<div align='center'>$log</div>";
}
?>
</td>
<?php include("block/right_td.php");?>
</tr>
</table></td>
</tr>
<tr>
<?php include("block/footer.php");?>
</tr>
</table>
</body>
</html>
|
| |
|
|
| |
|