Announcement

Collapse
No announcement yet.

Textvergleich aus Datenbank Deutsch/Englisch zu langsam?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Textvergleich aus Datenbank Deutsch/Englisch zu langsam?

    Hi,
    ich habe ein Problem mit der Geschwindigt meines Programmes.
    Ich lese aus einer pg Datenbank deutsche Sätze aus, zu denen ich dann noch zusätzlich die passende englische Übersetzung hole.
    Durch meine Konstruktion ist das ganze ziemlich langsam geworden, zumal es bis zu 3000 Sätze sein können die ich in eine Listbox einlese.
    Ich habe leider keinen Ansatz, was da wen ausbremst.
    Hätte jemand eventuell ein paar Tips und Tricks das ganze etwas zu optimieren?

    vielen dank im Vorraus,

    nebul


    [highlight=c#]
    public void verbindung(string wort)
    {

    String dbConnString = "Server=localhost;Port=5432;Database=term;User Id=postgres;Password=test;Encoding=UNICODE";

    NpgsqlConnection conn = new NpgsqlConnection(dbConnString);

    try
    {
    conn.Open();
    NpgsqlCommand dbCommand = new NpgsqlCommand("select jtext.text from " +
    "(string join (select rootphrase.pid,lang from rootphrase where lang='de'" +
    ") as rp using(pid)) as jtext where jtext.text like '%" +
    wort + "%';", conn);



    NpgsqlDataReader dbReader = dbCommand.ExecuteReader();
    while (dbReader.Read())
    {
    lst_deutsch.Items.Add(dbReader.GetValue(0).ToStrin g());
    }
    dbReader.Close();


    foreach (String item in lst_deutsch.Items)
    {


    NpgsqlCommand dbCommand2 = new NpgsqlCommand("SELECT text FROM string WHERE pid IN(" +
    "SELECT pid FROM rootphrase WHERE lang='en' AND rpid IN(" +
    "SELECT rpid FROM rootphrase WHERE lang='de' AND pid IN(" +
    "SELECT pid FROM string WHERE lower(text) LIKE '%" + item.ToLower() +
    "%')) LIMIT 10)ORDER BY pid ASC;", conn);
    NpgsqlDataReader dbReader2 = dbCommand2.ExecuteReader();
    while (dbReader2.Read())
    {
    listBox_translate.Items.Add(dbReader2.GetValue(0). ToString());
    }
    dbReader2.Close();

    }
    }
    catch (System.Exception fMeldung)
    {
    MessageBox.Show(fMeldung.Message);
    }
    finally
    {
    conn.Close();
    }


    }[/highlight]

  • #2
    Wer könnte 3000 Datensätze in einer Listbox auf dem Bildschirm lesen & verarbeiten.

    Wenig zielführend könnte es weiterhin sein, die Sätze nach den entsprechenden Worten zu durchsuchen. Ein alternativer Ansatz wäre, bsp. jedes Wort einmal in eine Tabelle zu schreiben und dazu wo (in welchen Datensätzen) dieses Wort vorkommt.
    Christian

    Comment


    • #3
      ich gebe die Datensätze nicht mehr in Listboxen aus, war ziemlich unbedacht...
      Das ich die Sätze suche wo das entsprechende wort drin steht, ist gewollt bzw. gefordert.
      Gibt es weitere Möglichkeiten die Geschwindigtkeit anzupassen?

      mfg

      Comment


      • #4
        Das ist die Aufgabe eines Volltextindexes. Das kann Postgres.

        Comment


        • #5
          Das ich die Sätze suche wo das entsprechende wort drin steht, ist gewollt bzw. gefordert.
          Gibt es weitere Möglichkeiten die Geschwindigtkeit anzupassen?
          jedes Wort einmal in eine Tabelle zu schreiben und dazu wo (in welchen Datensätzen) dieses Wort vorkommt.
          Christian

          Comment


          • #6
            Originally posted by Christian Marquardt View Post
            jedes Wort einmal in eine Tabelle zu schreiben und dazu wo (in welchen Datensätzen) dieses Wort vorkommt.
            Aber dann doch eher eine fertige Volltextsuche verwenden, als selbst eine nachzubauen. Schau Dir mal das hier an:

            http://lucene.apache.org/java/docs/index.html

            Gibt es auch einen Port für .NET

            Comment


            • #7
              Aber dann doch eher eine fertige Volltextsuche verwenden, als selbst eine nachzubauen. Schau Dir mal das hier an:
              Damit hast du jetzt Postgres gleich ganz wegempfohlen Was auf ein 'machs neu' hinausläuft.

              Comment


              • #8
                Was auf ein 'machs neu' hinausläuft.
                Er wird doch etwas machen müssen, da das Suchen zur Laufzeit zu langsam ist. Irgendwie wird er sich einen Index anlegen müssen. Entweder manuell (extra Tabelle), "halb-manuell" mit Lucene oder es der DB überlassen (Postgres)
                Christian

                Comment


                • #9
                  Ist natürlich richtig. Aber auf diesem Level 'reiner Text' kann man Lucene nicht nur als Index sondern auch als Dokumentendatenbank auffassen. Als Ergebnis der Suche auf dem Lucene Index käme das Dokument(der Satz) zurück es gibt also gar keinen Bedarf den auch in einer Datenbank zu speichern. Ich fand es eben witzig (scheinbar nur ich) auf die Frage 'wie optimiere ich meine Lösung' mit etwas zu antworten das keinen Teil der ursprünglichen Lösung mehr enthält.

                  Comment

                  Working...
                  X