« 1 2
Autor Zpráva
juriad
Profil
Na řádku 184 máš:
if (empty(!empty($message))){
Tento if není nikde ukončený. Kromě toho, že je přinejmenším podivný, není mi jasné, k čemu slouží.

A koukám, že jsi smazal funkci boldize. Tu jsi měl zachovat, jen ji drobně poupravit.
Mozkomor05
Profil
Díky paráda funguje funkci boldize jsem vrátil (a samozřejmě odstranil [0]) a vše funguje. Předtím mi to nefungovalo protože jsem tvým kódem přepsal stránkování (ve kterém byl i konec od if - })
Mozkomor05
Profil
Ahoj, vše mi již funguje. Jen bych chtěl udělat, že výsledky vyhledávání se seřadí podle výskytu. Např.:
Slovo jsem se vyskytuje v několika článcích v jednom jednou v druhém pětkrát. Jak mám udělat, aby článek ve kterém je slovo pětkrát byl nahoře? Předem děkuji za odpověď.
juriad
Profil
Podívej se na dotaz navržený v stackoverflow.com/a/22132942/4052811. Vyhledávání se obvykle nedělá pomocí operátoru LIKE, ale pomocí MATCH a FULLTEXTového indexu, ale ten zase neumí hledat uvnitř slova. Pro ještě pokročilejší věci se používá něco jako Lucene nebo ElasticSearch, které pracují přímo se slovy a řeší třeba skloňování.

Pokud tě netrápí výkon, můžeš používat LIKE jako doposud. Kdybys měl nějaké problémy s adaptací toho SQL dotazu, napiš, k čemu jsi došel.
Mozkomor05
Profil
Píše mi to: Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /3w/wz.cz/k/kolemzeme/zkouska.php on line 170


Použil jsem sql dotaz:
$data = mysql_query("SELECT * COUNT(Text LIKE '%".mysql_real_escape_string($item)."%') AS cnt  FROM `hledat_web` WHERE `Nadpis` LIKE '%".mysql_real_escape_string($item)."%' OR `Text` LIKE '%".mysql_real_escape_string($item)."%' ORDER BY cnt LIMIT ".$paging_fulltext->get_start().", ".$paging_fulltext->get_limit()."");
Lonanek
Profil
A jak vypadá řádek 170 souboru zkouska.php?
Mozkomor05
Profil
while($row = MySQL_Fetch_Assoc($data))
juriad
Profil
Ach. Chybí ti čárka v seznamu sloupců (za *). Ale to je stejně jedno, protože jsi použil špatný dotaz (ten dotaz, u kterého se tazatel na SO říkal, že mu nefunguje), měl jsi použít ten v první odpovědi. Ale teď jsem si to zkusil a zjistil jsem, že to stejně nepomůže: replace nahrazuje přesnou shodu; šlo by použít vlastní funkci replace_ci, ale to stále nevyřeší diakritiku. Programovat cokoli pokročilejšího v databázi jen brutálně zhorší její výkon.

Nemám tedy lepší radu než použít fulltextový index. Upozorňuji, že pak vyhledávání probíhá po celých slovech, nebude už možné hledat uprostřed slova.

Vytvoříš si index přes dvojici sloupců (Nadpis, Text):
CREATE FULLTEXT INDEX f_hledat_web ON hledat_web (Nadpis, Text);

A dotaz pak bude:
$esc_item = mysql_real_escape_string($item);
$data = mysql_query("SELECT *, MATCH(Nadpis, Text) AGAINS ('$esc_item' IN BOOLEAN MODE) AS score
FROM hledat_web
WHERE MATCH(Nadpis, Text) AGAINS ('$esc_item' IN BOOLEAN MODE)
ORDER BY score DESC
LIMIT ".$paging_fulltext->get_start().", ".$paging_fulltext->get_limit());

Podívej se také na stránku dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html, kde jsou popsané všechny operátory. Nevím pro koho je hledání určené, takže je možné, že jej budeš muset nějak ošetřit, aby uživatelé tyto operátory nemohli používat.
Mozkomor05
Profil
Jo funguje, ale nešlo by to udělat s LIKE? Protože AGAINS hledá pouze po celých slovech.
juriad
Profil
U AGAINST můžeš použít *, která hledá prefix slova, viz odkaz v dokumentaci.

Šlo, pokud bys chtěl ukládat Nadpis a Text dvakrát (přidat sloupce NadpisAscii, TextAscii), podruhé by to bylo bez diakritiky a malými písmeny. LIKE sice funguje, ale je pomalý, protože databáze musí hledat v každém řádku.
FULLTEXTový index naopak zná slova v jednotlivých řádcích, a tak se zajímá jen o řádky, které skutečně to slovo obsahují. Na 50 záznamech to nepoznáš, ale až jich budeš mít ~10 000, už to bude výrazné.
« 1 2

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0