| 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: 15 let
|
|||
0