Autor | Zpráva | ||
---|---|---|---|
Háva Profil |
#1 · Zasláno: 9. 2. 2012, 14:53:35
Ahoj učím se používat fulltextové vyhledávání. Našel jsem tento script na www.zaachi.com/cs/items/php-mysql-vyhledavani.html, vyhledávání funguje, jenom bych chtěl aby mi prohledával i jiné sloupce než nazev např sloupec text a pak se výsledek setřídil podle vyhledávání ve sloupci nazev a pak text.
<?php $string = $_POST['search']; //vytvorime si pole slov, ktere pripadaji v uvahu pro vyhledavani $array = preg_split("/[s,]+/", $string ); //osetrime hodnoty pro vyledavani: foreach( $array as $id=>$value ){ $array[$id] = addslashes( htmlspecialchars( $value ) ); } //vytvorime zacatek selectu $select = "SELECT * FROM zbozi WHERE nazev REGEXP '[[:<:]]"; //pro kazde slovo v hledanem retezci vytvorime podminku $select .= implode($array, "[[:>:]]' OR nazev REGEXP [[:<:]]"); //a konec posledni podminky $select .= "[[:>:]]'"; //nakonec jeste muzeme pridat podminku por cely retezec if( count( $array ) > 1 ){ $select .= " OR nazev REGEXP '[[:<:]]" . addslashes( htmlspecialchars( trim( $string ) ) ) . "[[:>:]]'"; } $result = mysql_query($select); while ($row=mysql_fetch_array($result)) { echo $row["nazev"]; echo "<br>"; } ?> |
||
Joker Profil |
#2 · Zasláno: 9. 2. 2012, 15:06:39
Háva:
To není fulltextové vyhledávání, ale vyhledávání podle regulárního výrazu. Pokud jde o dotaz, bylo by nutné do podmínky přidat několik dalších podmínek na ty sloupce. S tím řazením si nejsem jistý. |
||
Háva Profil |
A myslíš že tohle řešení je dobré? Jde mi o to že by jsem chtěl vyhledávat např ve dvou sloupcích nazev, popis, tak aby to vyhledalo i když se zadá třeba jenom část slova a nebo naopak když zadám do vyledávání frázi dvou slov. No a řazení by mělo být priorita sloupec nazev a pak popis když v názvu to slovo nebude.
Ještě jsem zkoušel toto: $query = "SELECT nazev,popis FROM zbozi WHERE nazev LIKE '%$search%' or popis LIKE '%$search%'";
Ale tady mám také problém v řazení sice to hledá všude ale nevím jak přidat tu prioritu ke sloupci nazev? |
||
Sir Tom Profil |
#4 · Zasláno: 9. 2. 2012, 15:55:25
|
||
Háva Profil |
#5 · Zasláno: 9. 2. 2012, 19:07:11
Sir Tom:
Díky na to jsem taky koukal tam sice fungují ty priority řazení ale zase to nehledá třeba část řetězce jako LIKE při použití %, a nebo to lze taky tady nějak použít? A druhá věc co s diakritikou aby mi to hledalo i když budu vyhledávat bez háčků a čárek? |
||
Alphard Profil |
#6 · Zasláno: 9. 2. 2012, 19:33:25
Fulltext index v pětkové verzi nefunguje na tabulkách InnoDB (u nových verzí by snad měl), to je jedno z omezení. Ale na řazení podle relevance je dobrý.
Priorita pomocí like bude problém. Jde ro řešit třeba větveným příkazem, ale bál bych se výkonu. |
||
Háva Profil |
Alphard:
Děkuji vyzkouším a co ta diakritika, to si mám ten hledaný výraz převézt na výraz bez háčků, to samé pro DB a pak až vyhledat? A ještě asi jeden dotaz: Když budu chtít vyhledávat řetězec např dvou slov (originální šperk) a do vyhledávání napíší třeba originál šperk, tak mi to nic nenajde, přitom šperk tam je. To musím tento zápis LIKE '%$search%' nějak pozměnit?
|
||
Alphard Profil |
PHP vyhledávání bez diakritiky
Pro více slov, pokud nepoužijete fulltext, který to umí nativně, tak asi rozebrat na slova a hledat samostatně. |
||
Háva Profil |
#9 · Zasláno: 10. 2. 2012, 13:40:03
Alphard:
Nakonec jsem to upravil takto: $hledej = mysql_real_escape_string($_POST["search"]); $vysledek = mysql_query(" SELECT * FROM zbozi WHERE MATCH(nazev) AGAINST ('$hledej*' IN BOOLEAN MODE) OR MATCH(popis) AGAINST ('$hledej*' IN BOOLEAN MODE) ORDER BY 5 * MATCH(nazev) AGAINST ('$hledej*') + MATCH(popis) AGAINST ('$hledej*') DESC "); Ale ještě jeden dotaz chtěl bych kyž bude hledný výrz složn s více slov aby se prohledávali všechny a pak to i podle shody řadilo. Přečetl jsem si že řetězec musímrozdělit do pole a pak zřejměvyhledáavt všechny slova. $slova = explode(" ", $hledej); [b][/b]
Takto si rozdělím jednotlivá slova pro hledání , ale jak pak mám složit ten dotaz pro hledání? |
||
Časová prodleva: 13 let
|
0