fulltext in moolean mode

Status
Niet open voor verdere reacties.

Niek62

Gebruiker
Lid geworden
24 mrt 2010
Berichten
24
Ik heb onderstaand script in gebruik, maar het zoeken in fulltext in moolean mode zoekt het script alleen naar woorden van minimaal 4 tekens. Is daar iets aan te veranderen zodat die ook (eerste letter voornaam) 1 teken zoekt, want als je bijvoorbeeld zoekt op naam "jan, tim, els, rob, enz,enz " dan geeft het geen resultaat


Code:
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<?php


// Kijken of het formulier is ingevuld
if (isset($_POST['zoeken'])) {

// functie om tekste te verkleinen 
function dec_str($line, $len)
{
    if (strlen($line) > $len)
        $afgekort = substr($line, 0, $len) . "...";
    else
        $afgekort = $line;

    return ($afgekort);
}


// functie om de zoekresultaten te scheiden, er een plus tussen te zetten enz.
function getMySQLZoekterm($zoekterm){

    // Stripslashes, indien nodig
    $zoekterm  = (get_magic_quotes_gpc == 0 ? stripslashes($zoekterm) : $zoekterm);

    // Vervang de spaties tussen " en " door een |
    if (preg_match_all('/\"(.*?)\"/', $zoekterm, $matches, PREG_SET_ORDER)) {
        foreach($matches as $match) {
            $zoekterm = str_replace($match[0], str_replace(' ', '|', $match[0]), $zoekterm);
        }
    }

    // Vervang de spaties tussen ( en } door een ~
    if (preg_match_all('/\((.*?)\)/', $zoekterm, $matches, PREG_SET_ORDER)) {
        foreach($matches as $match) {
            $zoekterm = str_replace($match[0], str_replace(' ', '~', $match[0]), $zoekterm);
        }
    }

    // Stop de zoektermen in een array
    $zoektermTemp = preg_split("/[\s,]+/", $zoekterm);

    // Doorloop de zoektermen, op zoek naar dubbele keywords achter elkaar
    $aantalAND     = 0;
    $aantalOR   = 0;
    $zoekterm = array();
    $i = 0;
    while(list($key, $val) = each($zoektermTemp)){

        if (strtoupper($val) == "AND" OR strtoupper($val) == "OR"){

            // Als de term hiervoor ook al een operator is, deze verwijderen
            if ($key != 0){
                if (!(    strtoupper($zoektermTemp[$key-1]) == "AND" OR
                        strtoupper($zoektermTemp[$key-1]) == "OR")){
                    $zoekterm[$i] = strtoupper($val);
                    $i++;

                    // Tel aantal AND en OR's die overblijven
                    if (strtoupper($val) == "AND"){
                        $aantalAND++;
                    }else{
                        $aantalOR++;
                    }
                }
            }

        }else{

            // Als de vorige term geen operator was, moet er nu een AND tussen
            if ($i > 0){
                if ($zoekterm[$i-1] != "AND" AND $zoekterm[$i-1] != "OR"){
                    $zoekterm[$i] = "AND";
                    $i++;
                }
            }

            // Zoekterm toevoegen
            $zoekterm[$i] = $val;
            $i++;

        }

    }

    // Doorloop de zoektermen, op zoek naar een AND
    while(list($key, $val) = each($zoekterm)){

        if (strtoupper($val) == "AND"){

            // De term voor en na deze term zijn verplicht
            if ($key != 0){
                // Voorkom een dubbel plusje
                if (substr($zoekterm[$key-1], 0, 1) != "+"){
                    $zoekterm[$key-1] = "+" . $zoekterm[$key-1];
                }
            }
            if ($key != count($zoekterm) - 1){
                $zoekterm[$key+1] = "+" . $zoekterm[$key+1];
            }

        }

    }

    // Als er AND én OR in de zoektermen voorkomt, moeten er ronde haken om het AND-deel
    if ($aantalAND > 0 && $aantalOR > 0){

        reset($zoekterm);

        while(list($key, $val) = each($zoekterm)){

            // Openingshaak: (
            if ($key != count($zoekterm) - 1){
                if ($zoekterm[$key+1] == "AND"){
                    $zoekterm[$key] = "(" . $zoekterm[$key];
                }
            }

            // Sluithaak: )
            if ($key != 0){
                if ($zoekterm[$key-1] == "AND"){
                    $zoekterm[$key] = $zoekterm[$key] . ")";
                }
            }

        }

    }

// Haal de | en ~ weer weg
    $zoekterm = str_replace("|",     " ",     $zoekterm);
    $zoekterm = str_replace("~",     " ",     $zoekterm);

// Haal handmatig de AND en OR weg
    $zoekterm = str_replace("AND",    "",     $zoekterm);
    $zoekterm = str_replace("OR",     "",     $zoekterm);

    // Plak de zoekterm weer aan elkaar
    $zoekterm = implode(" ", $zoekterm);

    return $zoekterm;

}

include ('db_adreslijst.php');

mysql_connect($dbhost, $dbuser, $dbpass) or die($mysql_con);
mysql_select_db($db) or die($mysql_dat);

$zoeken = $_POST['zoeken'];
$find = getMySQLZoekterm($zoeken);

//Kijken of er wat is ingevuld
if ($find == "")
{
echo '<p>U heeft geen zoekterm ingevuld';
exit;
}

//Nu de sql query uitvoeren met de fulltext in moolean mode
$db = mysql_query(" SELECT * FROM adressen WHERE MATCH(Naam, Voornaam, Geb_datum, Straat, Nr, Postcode, Plaats, Land, Telefoon, Gsm, Email) AGAINST('".$find."')");

echo '<table text-align="center" border="1px" bordercolor="#000000" width="90%" celpadding="2" celspaccing="2">
  <tr>
    <td class="adr"><B>Naam</b></td>
    <td class="adr"><B>Voornaam</B></td>
    <td class="adr"><B>Geb_datum</B></td>
    <td class="adr"><B>Straat</B></td>
    <td class="adr"><B>Nr</B></td>
    <td class="adr"><B>Postcode</B></td>
    <td class="adr"><B>Plaats</B></td>
    <td class="adr"><B>Land</B></td>
    <td class="adr"><B>Telefoon</B></td>
    <td class="adr"><B>Gsm</b></td>
    <td class="adr"><B>Email</B></td>
    <td class="adr"><B>Wijzig</B></td>
    <td class="adr"><B>Delete</B></td>
  </tr>';

 
// de resultaten doorzoeken
while($result = mysql_fetch_array($db))
{
$beschrijving = dec_str($result['beschrijving'], 15);

echo '<tr>';
echo '<td class="adr1">';
echo $result['Naam'];

echo '</td><td class="adr1">';
echo $result['Voornaam'];

echo '</td><td class="adr1">';
echo $result['Geb_datum'];

echo '</td><td class="adr1">';
echo $result['Straat'];

echo '</td><td class="adr1">';
echo $result['Nr'];

echo '</td><td class="adr1">';
echo $result['Postcode'];

echo '</td><td class="adr1">';
echo $result['Plaats'];

echo '</td><td class="adr1">';
echo $result['Land'];

echo '</td><td class="adr1">';
echo $result['Telefoon'];

echo '</td><td class="adr1">';
echo $result['Gsm'];

echo '</td><td class="adr1">';
echo $result['Email'];

echo '</td><td class="adr1">';
echo '<a href="aanpassen.php">Update</a>';

echo '</td><td class="adr1">';
echo '<a href="verwijderen.php">Delete</a>';
echo '</td></tr>';
}
echo '</table>';


// kijken of er wel resulaten zijn
$anymatches=mysql_num_rows($db);
if ($anymatches == 0)
{
echo '<br>Er zijn geen resultaten<br>';
}

//Nog even zeggen waar naar gezocht werd
echo '<br>Gezocht naar:<b> ' .$find; echo '</b><br><br><a href="javascript:javascript:history.go(-1)">terug naar overzicht</a>';


} else {
// het formulier
?>
<table border="1px" bordercolor="#000000" width="280" celpadding="2" celspaccing="2">
  <form action="" method="POST">
    <tr>
      <td>Zoekterm:</td><td><input name="zoeken" type="text"></td>
    </tr>
    <tr>
      <td colspan="2"><input type="submit" name="submit" value="Zoek!" style="width: 275"></td>
    </tr>
  </form> 
</table>
<br><br><a href="javascript:javascript:history.go(-1)">terug naar overzicht</a>
<?php
}
?>
 
Laatst bewerkt:
Waarom zoek je met Fulltext op namen? Kun je niet beter gewoon een LIKE gebruiken? Ik neem aan dat je een exacte match wilt op een kolom met alleen een naam erin, en niet een boek doorzoekt op voorkomens van een bepaalde naam?
 
ik wil dit gebruiken in een leden bestand, en is dat bij een kleine vereniging niet zo;n probleem omdat je dat in een opslag wel kunt bekijken, maar met 800 leden word het toch al wat veel, als vader, zoon(en), dochter(s),en soms moeder een partijte willen spelen, en opa die op zaterdag de veteraan wil wilt uithangen.
En zoals ik dit nu gebruik hoef ik alleen maar een naam in te vullen en krijg alle gegevens van die persoon in keer te zien.
Maarja wat doe ik met Rob Roy, Jan Tol of Tim Bol die vind dan niet je niet meer zo gemakkelijk.

Ik heb heb hier en daar wel al gezocht naar een ander zoekscript maar niks gevonden, en om zoiets zelf te maken is een iq van 105 of lager niet voeldoende.
 
Ehh....

Probeer het eens gewoon zo:

[sql]
SELECT *
FROM tabel
WHERE name LIKE '%jan%'
[/sql]


FULLTEXT is een speciale zoekmethode om hele grote lappen tekst (hele boeken of websites) heel snel te doorzoeken op bepaalde woorden. Als je tekst maar een paar tekens lang is (zoals namen) dan kun je gewoon LIKE gebruiken. Het %-teken betekend "er mogen hier ook nog tekens staan" dus bovenstaand voorbeeld zoekt iedereen met "jan" ergens in de naam.

Lees ook:
http://dev.mysql.com/doc/refman/5.1/en/string-comparison-functions.html
 
Je bedoeld zoiets als dit:
SELECT * FROM adressen WHERE Naam LIKE '%$HTTP_POST_VARS[zoekterm]%'";

Maar dan kan ik alleen op Naam zoeken.
Maar wat als ik ff niet op iemand achternaam kan komen, maar de voornaam en adres weet, dus moet ik ook op andere dingen kunnen zoeken.
ik had al geprobeerd met "where Naam OR Voornaam like" maar dat werkt niet
 
Kan wel, maar dan moet het zo:

[sql]
SELECT *
FROM tabel
WHERE naam LIKE '%jan%' OR achternaam LIKE '%jan%'
[/sql]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan