Avatar billede andersbl Nybegynder
08. juli 2011 - 12:07 Der er 8 kommentarer og
1 løsning

Søge algoritme

Hej Eksperter
Jeg prøver at finde en måde hvor på jeg kan forbedre søge funktionen ved et SQL kald.
INFO: SQL-sætningen bliver kalder hver gang man taster et bogstav, så kan hurtig komme mange kald.

Nu bruger jeg:
SELECT navn FROM personer WHERE navn LIKE '%and%'

Jeg tænkte om man kunne bruge noget med. Hvor rækken så bliver sorteret med de navn som indholder flest bogstaver:
SELECT navn FROM personer WHERE CHARINDEX('a', navn ) > 1 OR
CHARINDEX('n', navn ) > 1 OR
CHARINDEX('d', navn ) > 1

Nogle der kan hjælpe med det her?
Avatar billede janus_007 Nybegynder
08. juli 2011 - 12:14 #1
Hvor mange rækker indeholder Personer?
Avatar billede andersbl Nybegynder
08. juli 2011 - 12:31 #2
Der er pt. 38.000 rækker
Jeg arbejder med MS SQL 2008 og Java
Avatar billede arne_v Ekspert
08. juli 2011 - 19:07 #3
Lav en klasse IdNavn med to properties Id og Navn, laes alle 38000 ind i en ArrayList<IdNavn> og soeg i den i memory.
Avatar billede janus_007 Nybegynder
08. juli 2011 - 22:48 #4
Lige akkurat... det var netop derfor jeg spurgte efter antallet af rækker :)
Avatar billede andersbl Nybegynder
09. juli 2011 - 09:34 #5
Så laver jeg noget med contains og andre smarte søge ting. Har i.et.eksempel?
Avatar billede janus_007 Nybegynder
09. juli 2011 - 10:27 #6
Kommer an på hvad du programmerer i, men eks.vis C#, så er det jo til at lave...
eks.vis StartsWith, IndexOf osv.

var personer = HentAllePersonnavneFraDB();

Lad os sige at personer returnere noget alá:
var personer = new[] { "Tom", "Dick", "Harry", "Mary", "Jay" };

var tmp = personer.Where (n => n.StartsWith("T"));
var tmp = personer.Where (n => n.IndexOf("T") >= 0);

Så kan du debugge dig igennem og kigge på indholdet :)
Avatar billede arne_v Ekspert
09. juli 2011 - 16:29 #7
Noget Java kode:

import java.util.ArrayList;
import java.util.List;

import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;

public class FastLike {
    public static List<String> LoadFromDB() {
        // mockup
        // real code will do SELECT navn FROM personer
        List<String> res = new ArrayList<String>();
        res.add("Anders And");
        res.add("Joakim Von And");
        res.add("Rip");
        res.add("Rap");
        res.add("Rup");
        res.add("Andersine");
        res.add("Fætter Højben");
        res.add("Georg Gearløs");
        return res;
    }
    public static List<String> containsFilter(List<String> input, String target) {
        List<String> res = new ArrayList<String>();
        for(String elm : input) {
            if(elm.contains(target)) {
                res.add(elm);
            }
        }
        return res;
    }
    public interface ListFilter<T> {
        public boolean accept(T o);
    }
    public static <T> List<T> filterList(List<T> input, ListFilter<T> filter) {
        List<T> res = new ArrayList<T>();
        for(T elm : input) {
            if(filter.accept(elm)) {
                res.add(elm);
            }
        }
        return res;
    }
    public static void main(String[] args) {
        List<String> andeby = LoadFromDB();
        // manual
        for(String fignam : andeby) {
            if(fignam.contains("And")) {
                System.out.println(fignam);
            }
        }
        // specific string contains filter
        for(String fignam : containsFilter(andeby, "And")) {
            System.out.println(fignam);
        }
        // general custom filter
        for(String fignam : filterList(andeby, new ListFilter<String>() {
            public boolean accept(String o) {
                return o.contains("And");
            } })) {
            System.out.println(fignam);
        }
        // Google collections
        for(String fignam : Collections2.filter(andeby, new Predicate<String>() {
            public boolean apply(String o) {
                return o.contains("And");
            } })) {
            System.out.println(fignam);
        }
    }
}
Avatar billede andersbl Nybegynder
10. juli 2011 - 11:06 #8
Det virker til jeg iikkeq kan forlange om mere. Smider du et svar arne
Avatar billede arne_v Ekspert
10. juli 2011 - 17:11 #9
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester