[PHP/SQL] Volledige plaatsnaam vinden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Voor mijn zoeksysteem wil ik plaatsnamen uit een zoekstring filteren. Nu lukte me dat tot nu toe aardig totdat ik erachter kwam dat er ook plaatsnamen zijn met spaties :P (wie verzint het).

Ik explode mijn zoekstring dus op spaties en kijk of er één van al die woorden een plaatsnaam is. Nu werkt dat dus totdat er een spatie in de plaatsnaam zit want dan explode hij de plaatsnaam en is het geen plaatsnaam meer.
Bijv.:
'winkel den haag', wordt:
winkel
den
haag
Terwijl het me wel lukt met:
'winkel amsterdam'

Nu dacht ik, is het mogelijk om het andersom te doen?
Nu is mijn query:
PHP:
1
$selectplaats=mysql_query("SELECT * FROM plaats WHERE plaatsnaam='".$plaatsn."'") or die(mysql_error());


Hierin zoekt hij dus de plaats in de database op. Maar is het ook mogelijk om in de string zelf te zoeken op een plaatsnaam die ook in de database staat? Zou wel helemaal top zijn!

Trouwens zoeken met wildcards willen we liever niet hebben.
Dan zou ook op alles worden gezocht met 'den' (van Den Haag) dus bijv. denneboom terwijl er helemaal niet op wordt gezocht.

Ik hoop dat jullie een oplossing weten!

Mvg,
Sven

Acties:
  • 0 Henk 'm!

  • Peedy
  • Registratie: Februari 2002
  • Laatst online: 06-11-2024
Door je array van plaatsnamen loopen en dan strpos gebruiken met een !==false test. Wordt wel een zware load op je database server als je dat voor elk woord moet doen.... handiger is dan om alle plaatsnamen binnen te halen, in een array te gooien en dan een in_array search te doen icm met strpos.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$towns = // haal towns uit db en maak er een array van
if(in_array($zoekstring,$towns)) {
   $found = true;
} else {
     foreach($towns as $town) {
           if(strpos($town,$zoekstring)!==false) {
                  $found = true;
                  break;
           }
     }
}
if($found) {
      // gevonden 
}

Zo verlicht je de load een beetje, in_array is namelijk sneller dan een foreach. Als hij hem in de array gevonden heeft zal hij niet naar de foreach gaan. Staat hij niet in de array (in het geval van 'Den' bijv) dan zal hij kijken of het zoekwoord in de plaatsnaam voorkomt. Verder kan je er natuurlijk nog verdere tests op draaien zoals dat 'Den' los staat of vast zit (zoals bij 'dennenboom').

[ Voor 90% gewijzigd door Peedy op 26-08-2008 20:45 ]


Acties:
  • 0 Henk 'm!

  • paulh
  • Registratie: Juli 1999
  • Laatst online: 29-08 09:58
Tsja, ik begrijp dat je geen wildcards wilt maar hoeveel plaatsen hebben we nou in nederland? Dus is het wel zo'n groot probleem?

Je zou ook de losse woorden kunnen indexeren en die laten wijzen naar verschillende plaatsnamen.
Dan zou "den" naar zowel "Den Haag" als "Den Bosch" wijzen. Vervolgens zou je die resultaten kunnen proberen te matchen op de string die je al hebt.

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Paulh, ik denk dat ik ga doen wat jij zegt. Met wildcard en vervolgens laten matchen. Wat peedy zegt zal me veel te veel serverload geven aangezien er toch wel zon 5000 plaatsen in staan en dat wordt alleen maar meer, binnenkort komen er ook nog een aantal buitenlandse plaatsnamen bij.

Bedankt voor het idee paulh!

Acties:
  • 0 Henk 'm!

  • Paalsma!
  • Registratie: Februari 2005
  • Laatst online: 24-04-2023
zo zou het ook kunnen, dan heb je wel 1 query al heb ik geen idee in hoeverre die stapel OR's de perfomance beïnvloed ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$t="winkel bergen aan zee speelgoed";
$p=explode( " ", $t );

$sql="SELECT * FROM plaats WHERE ";

for( $c=count($p); $c>0; $c-- ) {
    for( $i=0; $i<$c; $i++ ) {
        $sql.="plaatsnaam='";
        for( $x=$i; $x<$c; $x++ ) {
            $sql.=$p[$x]." ";
        }
        $sql.="' OR ";
    }
}

$sql=substr( $sql, 0, -4 );

Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Paalsma! schreef op dinsdag 26 augustus 2008 @ 21:07:
zo zou het ook kunnen, dan heb je wel 1 query al heb ik geen idee in hoeverre die stapel OR's de perfomance beïnvloed ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$t="winkel bergen aan zee speelgoed";
$p=explode( " ", $t );

$sql="SELECT * FROM plaats WHERE ";

for( $c=count($p); $c>0; $c-- ) {
    for( $i=0; $i<$c; $i++ ) {
        $sql.="plaatsnaam='";
        for( $x=$i; $x<$c; $x++ ) {
            $sql.=$p[$x]." ";
        }
        $sql.="' OR ";
    }
}

$sql=substr( $sql, 0, -4 );
Of:
PHP:
1
2
3
4
5
$text="winkel bergen aan zee speelgoed";
$words =explode( " ", $text );
$words = array_map('mysql_real_escape_string', $words);

$sql="SELECT * FROM plaats WHERE plaatsnaam IN ('".implode("','", $words)."')";

Maar ik zou worden zoals 'den' er wel uitfilteren vantevoren, omdat dit teveel matcht. Misschien kan je ook eens naar een full text search kijken.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • Paalsma!
  • Registratie: Februari 2005
  • Laatst online: 24-04-2023
Borizz, met IN kan het idd wat efficienter, aan de andere kant werkt het volgens mij niet op de manier waarop je gewoon alle woorden achter elkaar plakt volgens mij?.

ps. er is sowieso een probleem met de plaats Winkel ;)

Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Paalsma! schreef op dinsdag 26 augustus 2008 @ 22:20:
Borizz, met IN kan het idd wat efficienter, aan de andere kant werkt het volgens mij niet op de manier waarop je gewoon alle woorden achter elkaar plakt volgens mij?.

ps. er is sowieso een probleem met de plaats Winkel ;)
Ik pak niet alle combinaties mee nee misschien is het handiger om dan de functie INSTR te gebruiken (gezien het toch maar een beperkt aantal plaatsnamen zijn in NL).

SQL:
1
SELECT * FROM plaats WHERE INSTR("zoektekst met plaatsnaam", plaatsnaam) > 0;

If I can't fix it, it ain't broken.

Pagina: 1