Ãëàâíîå, ñ ÷åì ñòàëêèâàåøüñÿ ïðè íàïèñàíèè ñêðèïòà äëÿ ïîèñêà - òî, ÷òî âñå êàæåòñÿ ïðîñòûì, íî îáúåì êîäà áûñòðî íàðàñòàåò.
Ïåðâûì äåëîì íàäî ïîðåçàòü ðó÷êàìè ñòðîêó.
$search = substr($search, 0, 64);
64 ñèìâîëîâ ïîëüçîâàòåëþ áóäåò äîñòàòî÷íî äëÿ ïîèñêà. Òåïåðü êàëåíûì æåëåçîì âûææåì âñå "íåíîðìàëüíûå" ñèìâîëû.
$search = preg_replace("/[^(w)|(x7F-xFF)|(s)]/", " ", $search);
Ïî èäåå, íåëüçÿ äàâàòü ïîëüçîâàòåëþ âîçìîæíîñòè èñêàòü ïî ñëèøêîì êîðîòêèì ñëîâàì - êðîìå âñåãî ïðî÷åãî, ýòî ñèëüíî çàãðóæàåò ñåðâåð. Èòàê, ðàçðåøèì èñêàòü òîëüêî ïî ñëîâàì, êîòîðûå äëèííåå äâóõ áóêâ (åñëè îãðàíè÷åíèå áîëüøå, íàäî çàìåíèòü "{1,2}" íà "{1, êîë-âî ñèìâîëîâ}").
$good = trim(preg_replace("/s([^s]{1,2})s/", " ", ereg_replace("[ ]%2B", " "," $search ")));
À ïîñëå çàìåíû ïëîõèõ ñëîâ - íàäî ñæàòü äâîéíûå ïðîáåëû (îíè áûëè ñäåëàíû ñïåöèàëüíî äëÿ êîððåêòíîãî ïîèñêà êîðîòêèõ ñëîâ).
$good = ereg_eplace("[ ]%2B", " ", $good);
Äîïóñòèì, ìû õîòèì ïðåäîñòàâèòü ïîëüçîâàòåëþ âîçìîæíîñòü âûáèðàòü ëîãèêó ïîèñêà - èñêàòü âñå ñëîâà èëè òîëüêî îäíî èç íåñêîëüêèõ. Åñëè âû õîòèòå ñäåëàòü êàê â ßíäåêñå [2] [1] - äâà àìïåðñàíòà îçíà÷àþò "È" (ñëîâî1&&ñëîâî2&&ñëîâî3) èëè êàê-òî åùå, òî ÿ íå ñîâåò÷èê. Øàìàíñòâî ñî ñòðîêàìè íà íåáîëüøîì ñàéòå imho íå îïðàâäûâàåò çàòðà÷åííîãî âðåìåíè. Ïîýòîìó ôîðìó äëÿ ïîèñêà ðèñóåì òàê:
À â ïîèñêîâîì ñêðèïòå ëèøíèé ðàç ïðîâåðÿåì, ÷òî ïîëüçîâàòåëü ââåë:if ($logic!="AND" && $logic!="OR")
$logic = "OR";
Êàê áóäåò èñïîëüçîâàòüñÿ ëîãèêà — íèæå.
Íàâåðíîå, â òîì æå ßíäåêñå [2] [1] âñå âèäåëè ññûëî÷êó "ñîðòèðîâàòü ïî ðåëåâàíòíîñòè". Ýòî îíî è åñòü. Ñîðòèðîâêà ðåçóëüòàòîâ ïî êîëè÷åñòâó ñîâïàäåíèé ñëîâ.
Îò÷àñòè, êñòàòè, òàêàÿ ñîðòèðîâêà ñíèìàåò ïðîáëåìó îáðàáîòêè ëîãèêè ïîèñêà. Íî ñ ÁÄ MySQL äåëàòü òàêóþ ñîðòèðîâêó î÷åíü ñëîæíî. Íàäî ñïåðâà âûáðàòü, ãäå åñòü âñå ñëîâà, ïîòîì çàïèñè, ãäå ðàçíûå ñëîâà (èñêëþ÷èâ ïðåäûäóùèå). Åñëè ó âàñ ïîñòðàíè÷íûé âûâîä - òî âîîáùå äåëî òðóáà!
Íåïëîõî áóäåò ñðàçó èíôîðìèðîâàòü ïîëüçîâàòåëÿ, ñêîëüêî îí íàøåë ñòðîê òàáëèöû. Äëÿ ýòîãî äåëàåòñÿ äîïîëíèòåëüíûé çàïðîñ â áàçó:
$query = "SELECT id FROM table WHERE field LIKE "%". str_replace(" ", "%" OR field LIKE "%", $good). "%"";
Äëÿ ñòàòèñòèêè ïî îòäåëüíûì ñëîâàì ìîæíî ñäåëàòü ñëåäóþùåå:
$word = explode(" ", $search);
while (list($k, $v) = each($word)) {
if (strlen($v)>2)
$stat[]="$v:". mysql_num_rows(mysql_query("SELECT id FROM table WHERE field LIKE "%$v%""));
else
$stat[]="$v: <font color=#cc0000>êîðîòêîå</font>";
};
$word_stats = "Ñòàòèñòèêà ñëîâ: ". implode("", $stat). "<br>";
unset($stat);
Íó, êîãäà ó íàñ åñòü ìàêåò äëÿ ïîèñêà è êîëè÷åñòâî ñòðîê ðåçóëüòàòà ïîèñêà, ñäåëàòü ïîñòðàíè÷íûé ïîèñê - ïàðà ïóñòÿêîâ. Ïðîâåðÿåì ïåðåìåííóþ $page (íå ìåíüøå 0, íå áîëüøå $results_amount/$rows_in_page).
 çàïðîñ, êîòîðûé ïîäñ÷èòûâàåò êîëè÷åñòâî ñòðîê (ñìîòðè âûøå), ïèøåì íóæíûå íàì ïîëÿ è ïîëÿ äëÿ ñîðòèðîâêè. À ïîòîì äîïèñûâàåì
if ($page==0)
$request .= "LIMIT $rows_in_page";
else
$request .= "LIMIT ". $page*$rows_in_page. ",". $rows_in_page;
(ñèíòàêñèñ: LIMIT <êîë-âî ñòðîê> ëèáî LIMIT <êîë-âî ñòðîê îòñòóïà>, <êîë-âî ñòðîê>)
 ðåçóëüòàòå âûïîëíåíèÿ ïîäîáíîãî çàïðîñà ìû ïîëó÷èì èìåííî òå ñàìûå ñòðîêè, êîòîðûå íàäî âûâîäèòü íà ñòðàíèöå.
Äëÿ íàâèãàöèè ìîæíî ëèáî ðèñîâàòü ññûëêè íà ñëåäóþùóþ è ïðåäûäóùóþ ñòðàíèöû, ëèáî, ÷òî ñëîæíåå, äåëàòü ïàíåëü íàâèãàöèè íà íåñêîëüêî ñòðàíèö.
if ($page>0)
print ("<a href=search.php?search=". rawurlencode($good). "&page=". ($page-1). ">ïðåäûäóùàÿ ñòðàíèöà</a>");
if ($page<$results_amount/$rows_in_page)
print ("<a href=search.php?search=". rawurlencode($good). "&page=". ($page%2B1). ">ñëåäóþùàÿ ñòðàíèöà</a>");
×òîáû ïîäñâå÷èâàòü ñâåòîì èëè æèðíûì øðèôòîì èñêîìûå ñëîâà â òåêñòå, íàäî ñäåëàòü âñåãî ëèøü ñëåäóþùåå:
$highlight = "(". str_replace(" ", "|", $good). ")";
Ïðîáåëû (à îíè ó íàñ ìåæäó ñëîâàìè ñòîÿò ïîîäèíî÷êå, è íèãäå äâîéíîé ïðîáåë íå âñòðå÷àåòñÿ, ê òîìó æå ñ êîíöîâ ñòðîêè ìû èõ òîæå âûðåçàëè) äîñòàòî÷íî çàìåíèòü íà âåðòèêàëüíóþ ÷åðòó - ðàçäåëèòåëü âàðèàíòîâ â ðåãóëÿðíûõ âûðàæåíèÿõ. "Ïëîõèå" ñëîâà ìû íå ïîäñâå÷èâàåì, ïîòîìó ÷òî â áàçå èõ íå èùåì :).
 êîäå, êîòîðûé âûâîäèò òåêñò ïèøåì:
$row["text"] = ereg_replace($highlight, "<font color=#cc0000>1</font>", $row["text"]);
Ïîñëå íàïèñàíèÿ âûïóñêà ÿ êèíóëñÿ, áûëî, ïèñàòü è ñåáå "ïîäñâåòêó". Íå òóò-òî áûëî! Ó ìåíÿ â òåêñòå âñòðå÷àþòñÿ òåãè HTML, ïîýòîìó ïðèøëîñü ìíîãî ïîäóìàòü... Ïîëó÷èëàñü âîò òàêàÿ âåùü (ñòðîêà ñî ñëîâàìè äëÿ ïîäñâåòêè åñòü):
$text = eregi_replace(">([^<]*)$words", ">1<font color=#cc0000>2</font>3<", $text);
Ïðèõîäèòñÿ ñìîòðåòü, íåò â òåãå ëè ýòî ñëîâî. Îäíàêî òóò âñòàåò ïðîáëåìà ðåñóðñîåìêîñòè òàêîé çàìåíû (ìîé K6-266 íàä òåêñòîì â 5 êèëîáàéò äóìàë öåëûõ ñåìü ñåêóíä). Ïå÷àëüíî.
Ïðèìåíÿÿ òàêèå ïðèåìû, ìîæíî, âî-ïåðâûõ, îãðàíè÷èòü ñâîáîäó äåéñòâèé ïîëüçîâàòåëÿ è íå äàòü åìó à) óçíàòü ïðîãðàììíóþ ñòðóêòóðó ñàéòà á) âûçâàòü ïåðåãðóçêó ñåðâåðà (íàïðèìåð, îòïðàâèâ ìåãàáàéò òåêñòà, ñîñòîÿùåãî èç ñëîâ äëèíîé â òðè áóêâû (ôðàçà ïîëó÷èëàñü äâóñìûñëåííàÿ, íî ïåðåïèñûâàòü íå áóäó :), ÷òîáû ñêðèïò 250 òûñÿ÷ ðàç ëàçèë â áàçó) â) óâèäåòü ñîîáùåíèå îá îøèáêå â ðåçóëüòàòå ïîïàäàíèÿ â ñòðîêó ñïåöñèìâîëîâ ÿçûêà çàïðîñîâ. Âî-âòîðûõ, íåêîòîðîå óäîáñòâî äëÿ ïîëüçîâàòåëÿ - ïîñòðàíè÷íûé âûâîä è ïîäñâåòêà.