ďťż
Podstrony
|
telcocafe// formularz echo " <form method=\"post\" action=\"$action\"> <div> Szukana fraza: <input type=\"text\" name=\"word\" value=\"\" /> Kategoria<select> </select> <input type=\"submit\" name=\"search\" value=\"Szukaj\" /> </div> </form> "; if($_POST[word]) { $w = trim($_POST[word]); $array = explode(" ",$w); $x=0; while(count($array)>=($x+1)) { if($x>0) $or = ' OR '; $warunek1 = $warunek1.$or.' (`title` LIKE \'%'.$array[$x].'%\' OR `content` LIKE \'%'.$array[$x].'%\')'; $warunek2 = $warunek2.$or.' `title` LIKE \'%'.$array[$x].'%\''; $warunek3 = $warunek3.$or.' (`title` LIKE \'%'.$array[$x].'%\' OR `content` LIKE \'%'.$array[$x].'%\' OR `ext_content` LIKE \'%'.$array[$x].'%\')'; $x++; } $zapytanie1 = 'SELECT "1" AS type,id,title FROM articles WHERE'.$warunek1.' UNION SELECT "2",id,title FROM gallery WHERE'.$warunek2.' UNION SELECT "3",id,title FROM news WHERE'.$warunek3.''; echo $zapytanie1;Witam, piszę skrypt wyszukwiarki 3 tabel w MySQL :) Na razie zostawiłem skrypt na etapie konstruowania zapytania, które ma szukać po 3 tabelach i jeśli się wpisze 2 słowa to każde z nich jest przeszukiwane oddzielnie. Czy można zrobićto optymalniej? A może najpierw łączyć tabele zamiast łączyć wyniki? Poradźcie coś proszę, bo nie wiem i mam dylemat :) Można zrobić to lepiej jeżeli trzeba - stosując narzędzia do pełnotekstowego wyszukiwania takie jak Sphinx, Xapian, czy Solr ;) Ale to na zwykłych hostingach jest nierealne. Można też popróbować z mechanizmem pełnotekstowym dostępnym w MySQL. Można zrobić to lepiej jeżeli trzeba - stosując narzędzia do pełnotekstowego wyszukiwania takie jak Sphinx, Xapian, czy Solr ;) Ale to na zwykłych hostingach jest nierealne. Można też popróbować z mechanizmem pełnotekstowym dostępnym w MySQL. A użycie UNION dla 3 SELECTów jest w porządku czy lepiej inaczej zapytanie skonstruowac?^^" Btw patrzylem na Twój artykuł o pełnotekstowym wyszukwianiu, zainteresowal mnie ;) Użytkownik Isaac from Vale edytował ten post 09 styczeń 2010, 13:42 UNION z natury złe nie jest. Jeżeli nie mogą wystąpić duplikaty to można UNION ALL. Wszystko rozbije się o ilość rekordów i ich rozmiar. Im więcej tego będzie tym takie wyszukiwanie z LIKE będzie szybko zwalniać. Czyli union nie jest nieoptymalne, tylko szukanie z like, które można by zmienić na wyszukiwanie pełnotekstowe? Dla niewielkiego nasilenia takiego zapytania nie ma to znaczenia. LIKE na pewno indeksów nie używa. Zapytania z UNION też mogą ich nie używać - trzeba to sprawdzić. A jak indeksu nie używa to na dużą skalę wydajne nie jest. Szukając pełnotekstowo zazwyczaj wyszukujesz ID pasujących wierszy i dalej z bazy pobierasz dane już dla konkretnych ID. count($array) możesz wrzucić do zmiennej i dać przed while :-) @Bełdzio: Jeśli już tak szczegółowo, to można jeszcze prościej ;) $count = count($array); while ($count > $x) { count($array)>=($x+1) count($array)>$xTo dwa takie same porównania, ale drugie jest szybsze :Tongue: |
|||
Sitedesign by AltusUmbrae. |