Autor Zpráva
Háva
Profil
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
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
Háva:
www.linuxsoft.cz/article.php?id_article=952
www.linuxsoft.cz/article.php?id_article=960
Háva
Profil
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
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
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í?

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