[MySQL]Fuzzy search probleem

Pagina: 1
Acties:

  • Niakmo
  • Registratie: Juni 2001
  • Laatst online: 10-02-2024
Het volgende is het geval. Ik heb een tabel met gegeven van gebruikers bijv:

name, prefix, surname, department enz.

Nu wil ik bij een search query die niks oplevert alternatieven opgeven mbv similar_text() in php.

Wat er moet gebeuren:

Als iemand zoekt op bijv Hank Timmmers en er word niks gevonden wil ik alle unieke keywords die beginnen met de letters H en T zodat ik deze kan vergelijken met de similar_text functie.

als ik zoek op Hank Timmmers zoek ziet mijn query er als volgt uit:

SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT DISTINCT name, surname, prefix, c_long, o_long, d_long 
FROM user a 
LEFT JOIN office b ON a.office = b.id 
LEFT JOIN department c ON a.department = c.id 
LEFT JOIN country d ON a.country = d.id 
WHERE LEFT(name,1) in ('H', 'T')
OR LEFT(surname,1) in ('H', 'T') 
OR LEFT(prefix,1) in ('H', 'T') 
OR LEFT(c_long,1) in ('H', 'T') 
OR LEFT(o_long,1) in ('H', 'T') 
OR LEFT(d_long,1) in ('H', 'T')



Maar omdat alle rijen met dezelfde department andere mensen zijn, werkt de distinct niet.

is het mogelijk met een query alle keywords in 1 kolom te selecteren zodat ik deze met for as loop kan doorlopen op similar_text?

  • x-force
  • Registratie: Maart 2001
  • Laatst online: 05-01-2024
Ik weet niet of het van toepassing is maar waarom maak je niet gebruik van de database zoekfuntionaliteit zoals bij MySQL full-textsearch?

Of mis ik het probleem nu?

VangenopBetaalwater.nl Het platform om ervaringen over betaalwater in Frankrijk te delen met andere karpervissers zodat iedereen kan vangen op betaalwater!


  • Niakmo
  • Registratie: Juni 2001
  • Laatst online: 10-02-2024
ik denk dat een full-textsearch hier te langzaam voor zal zijn. Verder zal de tabel nooit meer dan 1000 rijen bevatten.

Ik ben probeer nu gebruik te maken van SELECT AS, maar krijg het nog niet voor elkaar om een lijst van keywords te krijgen die beginnen met een H bijv.

  • x-force
  • Registratie: Maart 2001
  • Laatst online: 05-01-2024
Niakmo schreef op maandag 26 maart 2007 @ 14:46:
ik denk dat een full-textsearch hier te langzaam voor zal zijn. Verder zal de tabel nooit meer dan 1000 rijen bevatten.
Hier spreek je jezelf wel tegen, het is langzaam maar jij gebruikt maar weinig rijen. Uit mijn hoofd werkt fulltextsearch vanaf 5 rijen dus dit zou je kunnen proberen.

Hoe je verder je query kan verbeteren zou ik niet weten.

VangenopBetaalwater.nl Het platform om ervaringen over betaalwater in Frankrijk te delen met andere karpervissers zodat iedereen kan vangen op betaalwater!


  • Niakmo
  • Registratie: Juni 2001
  • Laatst online: 10-02-2024
ik heb het nu als volgt opgelost:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
        // create the IN part of the query
        for($j = 1; $j < sizeof($this->_search); $j++) {    
            
            $match = " ('" . substr($words[0], 0, 1) . "'";
            
            for ($i = 1; $i < sizeof($words); $i++) {
                    $match .= ", '" . substr($words[$i], 0, 1) . "'";
            }
            $match .= ")";
        }

        
        
        $query = "  SELECT          name AS keyword FROM user 
                    WHERE LEFT(name,1) IN $match
                    
                    UNION
                    SELECT          surname AS keyword FROM user
                    WHERE LEFT(surname,1) IN $match 
                    
                    UNION
                    SELECT          prefix AS keyword FROM user
                    WHERE LEFT(prefix,1) IN $match 
                    
                    UNION
                    SELECT          c_long AS keyword FROM user a
                    LEFT JOIN country b ON a.country = b.id
                    WHERE LEFT(c_long,1) IN $match 
                    
                    UNION
                    SELECT          o_long AS keyword FROM user a
                    LEFT JOIN office c ON a.office = c.id
                    WHERE LEFT(o_long,1) IN $match 
                    
                    UNION
                    SELECT          d_long AS keyword FROM user a
                    LEFT JOIN department d ON a.department = d.id 
                    WHERE LEFT(d_long,1) IN $match 
                    ";



ik gebruik voor elke kolom een aparte select. Deze oplossing ziet er redelijk vies uit, vooral om dat alle select het zelfde zijn op de kolom na. Is er misschien een efficiëntere oplossing.