# LIKE - Suche in DB



## smokie (12. Mai 2005)

Hallo zusammen !!!

Ich habe in meinem Java-Produktkatalog eine Artikelsuche und eine Volltextsuche.
Diese liefert aus meiner SQLite-Dartenbank jedoch nur Ergebnisse auf die genau eingegebene Bezeichnung.
Nun möchte ich meine Abfrage gern so programmieren, daß auch Begriffe mit Rechtschreibfehlern oder auch zb fehlenden Vokalen angenommen werden.

Wie geht sowas?
Entspricht die LIKE - Anweisung einer solchen Suche?
Hat damit nämlich igendwie nicht so ganz bei mir hingehauen.

Desweiteren läuft die Suche nicht, wenn es Leerzeichen innerhalb einer Artikelnummer gibt, Bspl: "K 5" liefert kein Ergebnis, sondern "K5".

Kann mir jemand weiterhelfen?
Danke. :roll:


----------



## bambi (12. Mai 2005)

Also mit LIKE kann man zB nicht "Meier" finden, wenn man "Meyer" eingibt. Da musst Du Dir schon was anderes schreiben, denk' ich.
Also mit

```
SELECT * FROM table WHERE name like '%Meier%'
```
wuerde alles gefunden werden, was den String "Meier" enthaelt - also sowas wie
  - "Meier-Hansen"
  - "Hans-Meier"
  - "Meiersen"
  - (und natuerlich) "Meier"


----------



## DP (12. Mai 2005)

fuzzi-suche


----------



## abollm (12. Mai 2005)

DP hat gesagt.:
			
		

> fuzzi-suche



Au ja, erklär mal in einfachen Worten wie das geht. 

Danke.


----------



## DP (12. Mai 2005)

http://de.wikipedia.org/wiki/Fuzzy-Suche bzw. http://de.wikipedia.org/wiki/Phonetische_Suche


----------



## abollm (12. Mai 2005)

Hmm, ganz nett die Links, aber jetzt weiß ich immer noch nicht wie ich den Java-Algorithmus implementieren muss. Trotzdem vielen Dank (ich wäre heute wohl nicht mehr darauf gekommen, bei Wikipedia nachzuschauen).


----------



## smokie (13. Mai 2005)

Danke für die schnellen Antworten.
Gibt es denn einen Algorithmus für die Fuzzy-Suche?
Weiss jemand wie ich das mit dem Leerzeichen lösen kann?


----------



## Bleiglanz (13. Mai 2005)

LIKE '%K 5%'

oder?


----------



## DP (13. Mai 2005)

%k 5% findet aber nicht k5?!


----------



## smokie (17. Mai 2005)

habe mal diverse foren nach der fuzzy-suche durchsucht aber kein programmierbeispiel gefunden.
dabei ist das doch eigentlich gar nicht sowas aussergewöhnliches, oder?!


----------



## Bleiglanz (17. Mai 2005)

DP hat gesagt.:
			
		

> %k 5% findet aber nicht k5?!



ist leider so

es gibt halt nur den wildcard % am anfang oder am ende

welche db hast du denn, ggf. gibts einfach sowas wie die SOUNDEX-Funktion (die immerhin nach ähnlich klingenden strings sucht)

glaube aber nicht, dass du eine query hinbekommst, die

    fook 5mal

udn

    giik5susi

mit einem suchausdruck finden kann...


----------



## smokie (17. Mai 2005)

hab ne SQLite-DB.
diese geschichte mit * und ? habe ich schon eingebaut.
wollte mein prog aber so benutzerfreundlich wie möglich gestalten und auch die unscharfe suche einbauen.
von dieser soundex-funktion habe ich auch gelesen.
gibt es sowas in java/sql ?


----------



## abollm (17. Mai 2005)

smokie hat gesagt.:
			
		

> hab ne SQLite-DB.
> [..]
> von dieser soundex-funktion habe ich auch gelesen.
> gibt es sowas in java/sql ?



Die "großen" Datenbanken wie z.B. Oracle unterstützen das. Für Java musst du dir eine solche Klasse selbst schreiben oder einfach danach "googeln". Als Anregung s. z.B. hier: 
http://www.cs.princeton.edu/introcs/31datatype/Soundex.java.html

Hth


----------



## abollm (17. Mai 2005)

smokie hat gesagt.:
			
		

> habe mal diverse foren nach der fuzzy-suche durchsucht aber kein programmierbeispiel gefunden.
> dabei ist das doch eigentlich gar nicht sowas aussergewöhnliches, oder?!



Ach, was mir gerade noch eingefallen ist:

In "The Art of Computer Programming, Bd. 3: Sorting and Searching" von Donald Earvin Knuth findest du auch einen Algorithmus für die phnonetische Darstellung.


----------



## smokie (17. Mai 2005)

danke für die hilfe.
werde damit mal etwas rumprobieren.


```
public class Soundex { 
    public static String soundex(String s) { 
       int SIZE = 4;
       char[] x = s.toUpperCase().toCharArray();
       char firstLetter = x[0];

       // convert letters to numeric code
       for (int i = 0; i < x.length; i++) {
          switch(x[i]) {
             case 'B':
             case 'F':
             case 'P':
             case 'V':   x[i] = '1'; break;

             case 'C':
             case 'G':
             case 'J':
             case 'K':
             case 'Q':
             case 'S':
             case 'X':
             case 'Z':   x[i] = '2'; break;

             case 'D':
             case 'T':   x[i] = '3'; break;

             case 'L':   x[i] = '4'; break;

             case 'M':
             case 'N':   x[i] = '5'; break;

             case 'R':   x[i] = '6'; break;

             default:    x[i] = '0'; break;
          }
       }

       // remove duplicates
       String output = "" + firstLetter;
       char last = x[0];
       for (int i = 1; i < x.length; i++) {
          if (x[i] != '0' && x[i] != last) {
             last = x[i];
             output += last;
          }
       }   

       // pad with 0's or truncate
       for (int i = output.length(); i < SIZE; i++)
          output += '0';
       output = output.substring(0, SIZE);

       return output;
    }


    public static void main(String[] args) {
       String name1 = args[0];
       String name2 = args[1];
       String code1 = soundex(name1);
       String code2 = soundex(name2);
       System.out.println(code1 + ": " + name1);
       System.out.println(code2 + ": " + name2);
    }
}
```


----------



## Bleiglanz (17. Mai 2005)

soundex(X) 	



> Compute the soundex encoding of the string X. The string "?000" is returned if the argument is NULL. This function is omitted from SQLite by default. It is only available the -DSQLITE_SOUNDEX=1 compiler option is used when SQLite is built.


----------



## smokie (17. Mai 2005)

wow, nicht schlecht.
muss nur mal gucken wie ich da rein komme.
muss ich den SQLite dann selber builden oder gibts da ne stelle wo ich quasi von 0 auf 1 ändern kann?

edit: oder eine version wo soundex enabled ist.


----------



## DP (19. Mai 2005)

Bleiglanz hat gesagt.:
			
		

> DP hat gesagt.:
> 
> 
> 
> ...



ja, aber wieso dann




			
				Bleiglanz hat gesagt.:
			
		

> LIKE '%K 5%'
> 
> oder?



?!


----------



## Bleiglanz (20. Mai 2005)

was meinst du?

bei fast allen DBs ignoriert ein LIKE die Gross und Kleinschreibung


----------

