Die sich selbst fütternde Datenbank, Prototypenkern-Kurzskizzierzung

Ein großer Schritt für mich, ein kleiner für die Allgemeinheit.

Weil's so gut lief, und ein Meilenstein in meiner Omxlerie geworden ist, soll's hier & heute mal als kleine Doku fast roh, nur grob editiert gepostet sein. Nicht als Anleitung gedacht, höchstens als Anregung.

Ich freue mich, ich hoffe, ihr euch auch ;-)

Da liest sich's btw. schöner:


( der eigentliche Titel; absichtlich wichtigtuerisch, zur Irreführung, das Prototypenkern-Kurzskizzierzung uso ;-) )

Start - Kern-Statement

Das Ziel ist schon hinreichend ausformuliert (in den letzten MP3s). Drum geht's hier gleich zur Sache.



SELECT
link_name
FROM links
WHERE link_id
IN
(
SELECT
link_id
FROM
(
SELECT link_id, ts_rank_cd(wortvektor, query) AS rank
FROM wortvektor, to_tsquery('ki & (technik | informatik) & zukunft') query
WHERE query @@ wortvektor
ORDER BY rank DESC
LIMIT 10
) AS linkid
);

Modifiziertes letztes Statement aus Wort-Vektoren mit PostgreSQL II

Total query runtime: 9 msec
10 Zeilen geholt.
"link_name"
"http://www.faz.net/aktuell/politik/ausland/vor-dem-papstbesuch-wo-steht-die-katholische-kirche-in-irland-15752524.html"
"http://www.faz.net/aktuell/wirtschaft/merkel-deutschland-darf-den-anschluss-nicht-verlieren-15593160.html"
"http://www.faz.net/aktuell/wirtschaft/diginomics/so-will-merkel-deutschland-in-ki-fit-machen-15892445.html"
"http://www.faz.net/aktuell/wirtschaft/diginomics/youtuber-wiegeln-die-kinder-auf-15884543.html?printPagedArticle=true#pageIndex_0"
"http://www.faz.net/aktuell/wissen/computer-mathematik/klug-verdrahtet-genau-hier-wird-die-erde-wieder-beben-15781435.html"
"http://www.faz.net/aktuell/feuilleton/der-geist-kommt-nicht-von-oben-sachbuch-ueber-die-entstehung-des-bewusstsein-15732036.html"
"http://www.faz.net/aktuell/feuilleton/debatten/autorin-und-psychotherapeutin-lena-kuhlmann-im-interview-15765249.html"
"http://www.faz.net/aktuell/wirtschaft/diginomics/youtuber-wiegeln-die-kinder-auf-15884543.html"
"http://www.faz.net/aktuell/wirtschaft/kramp-karrenbauer-fordert-grosse-steuerreform-15890214.html"
"http://www.faz.net/aktuell/feuilleton/kunst/banksys-geschreddertes-bild-zu-frueh-auf-den-knopf-gedrueckt-15844291.html"

 

Vorentscheidungen

 

Eine wichtige Vorentscheidung ist gefallen: Die neu gefundenen Links sollen ohne weitere Kennung der Tabelle "links" hinzugefügt werden. Je nach Wuchs onda Anwachsen kann diese immer noch iwi anders weiterverwendet oder iwi ausgemistet werden - noch ist genug Luft nach oben vorhanden, um auf die Größe der Menge noch kein Augenmerk richten zu müssen.

Und noch eine wichtige Entscheidung: Das entstehende Programm soll solange mit temporären Tabellen operieren, bis Gewissheit besteht, daß die ts_query-Suchen und die ts_rank-Vergleiche wirklich sinnvolle Ergebnisse liefern. Erst dann darf die Entscheidung fallen, ob die Links wie geplant in die links-Tabelle eingeschrieben werden können.

Das reicht, let's go!
...
Die ersten Versuche laufen. Kommt mir das nur so vor, oder ist es hier obszön kalt? ( Wobei ich mehr danach fragen will, ob der Ausdruck passen könnte, denn kalt ist es hier definitiv. )
...

 

Perl-Gerüst I

 

#!/usr/bin/perl

# tsquery_tsrank.pl

use strict;
use warnings;
use DBI;
use ZugangsDaten_postgresql qw($DB_USER $DB_PASSWD);
use Encode qw(decode encode);


# Variablen

our $dbh;


# Programm

print "\nHier meldet sich das Programm \"tsquery_tsrank.pl\": Huhu!\n\n";

### Connect

connect_db();

## Initialisierung

wordvector_init();

## Update
## Nur bei Bedarf aktivieren!

# wordvector_update();

## ts_query-Default

my $tsquery = "'ki & künstlich & intelligenz & (technik | informatik) & zukunft'";

## Testabfrage

my $query_rows_ref = tsquery($tsquery);

### Disconnect

disconnect_db();

## Testabfrage-Fortsetzung

my @query_rows = @$query_rows_ref;

print "\nHier sind die Ergebnisse!\n\n";
print map { $_, "\n" } @query_rows;
print "\nFertig!\n\n";






###########################################################
############### Subroutinen ####################
###########################################################

# Subroutinen

sub connect_db {
    ## Verbindung zur DB herstellen
    $dbh = DBI->connect("DBI:Pg:dbname=links;host=localhost", "$DB_USER", "$DB_PASSWD");
}

sub disconnect_db {
    $dbh->disconnect();
}

sub tsquery {
    my $tsquery = shift;
    my $tsquery_query = $dbh->prepare('SELECT
                                        link_name
                                        FROM links
                                        WHERE link_id
                                        IN
                                        (
                                        SELECT
                                        link_id
                                        FROM
                                        (
                                        SELECT link_id, ts_rank_cd(wordvector, query) AS rank
                                        FROM wordvectors, to_tsquery(?) query
                                        WHERE query @@ wordvector
                                        ORDER BY rank DESC
                                        LIMIT 10
                                        ) AS linkid
                                        );');
    $tsquery_query->execute($tsquery);
    my @query_rows;
    while ( my $query_row = $tsquery_query->fetchrow ) {
        $query_row = encode('UTF8', $query_row, Encode::FB_DEFAULT);
        print "\n$query_row\n";
        push @query_rows, $query_row
    }
    return \@query_rows
}


sub wordvector_init {
    my $wordvector_create = 'CREATE TABLE IF NOT EXISTS wordvectors
                             AS SELECT link_id, text, to_tsvector(text) AS vector
                             FROM texts WHERE length(text) < 1060000;';
    $dbh->do($wordvector_create) or print $dbh->errstr;
    my $wordvector_alter_table = 'ALTER TABLE wordvectors ADD COLUMN wordvector tsvector;';
    $dbh->do($wordvector_alter_table) or print $dbh->errstr;
    my $wordvector_create_index = 'CREATE INDEX IF NOT EXISTS idx_cont_word_vec ON wordvectors USING gin(wordvector);';
    $dbh->do($wordvector_create_index) or print $dbh->errstr;
}

sub wordvector_update {
    my $wordvector_update = 'UPDATE
                             wordvectors
                             SET
                             wordvector = to_tsvector(text);';
    $dbh->do($wordvector_update) or print $dbh->errstr;
}

# Subroutine Date

sub date {
    my $year = (localtime((time)))[5] + 1900;
    my $month = (localtime((time)))[4] + 1;
    my $mday = (localtime((time)))[3];
    my $date = $year.'-'.$month.'-'.$mday;
    return $date;
}

Es hat noch ein paar Schönheitsfehler. Ansonsten funzt alles ... bis auf die Abfrage. ???

( Ich muß mich aber erst mal im Bett aufwärmen, nach einer Pause geht's dann nachher weiter. Und derweil ich aufwärme, lasse ich den Schmadderradatsch noch einmal ganz von vorne ablaufen, table & index vorher droppen uso.  )

Vielleicht hilft mir das weiter:

( Immer noch nur 15°C, es wird trotz mehr heizen kaum wärmer, Mist! )

Fehler gefunden, mit dieser Zeile funzt es wie es soll:

my $tsquery = "ki & (technik | informatik) & zukunft";

Ganz klar ist mir zwar noch nicht, wieso es im "pgAdmin III" auch anders funzte, aber das sei mir jetzt mal egal.

Die Schönheitsfehler, die ich meinte, sind:
  • ADD COLUMN IF NOT EXISTS klappt nicht
  • Der Index wird nicht erstellt
  • Die Struktur meines Programms finde ich noch suboptimal
  • Mit den Tabellenbenennungen hadere ich noch ein wenig
Ich glaube, das waren sie. Darum kümmere ich mich später oder ein andermal.

Weiter geht's!

...

...


https://stellenmarkt.faz.net/job/studentische-aushilfskraft-m-w-online-shop-management.273632425.html?jw_chl_seg=FAZ&feed=premium
https://stellenmarkt.faz.net/job/tax-compliance-manager-m-w-d-zur-analyse-und-optimierung-des-tcm-systems.273544165.html?jw_chl_seg=FAZ&feed=premium
https://tarife.faz.net/
https://www.faz-rechte.de/startseite.htm
https://www.faz.net/mein-faz-net/?redirectUrl=/mein-faz-net/mein-abo/
https://www.faz.net/mein-faz-net/merkzettel/
https://www.faz.net/newsletter-auth/
https://www.rhein-main.net/

Es sind 222 Sublinks. Fertig!
Da tut sich eine (eigentlich gewohnte) Problematik auf. Na, mal weitersehen ...

Es entwickelt sich in Richtung Mini-Mammut-Werk ...

 

Code, Zwischenstand

#!/usr/bin/perl

# tsquery_tsrank.pl

use strict;
use warnings;
use DBI;
use ZugangsDaten_postgresql qw($DB_USER $DB_PASSWD);
use Encode qw(decode encode);
use Storable qw(store retrieve);


# Variablen

our $dbh;


# Programm

print "\nHier meldet sich das Programm \"tsquery_tsrank.pl\": Huhu!\n\n";

### Connect

connect_db();

## Initialisierung

wordvector_init();

## Update
## Nur bei Bedarf aktivieren!

# wordvector_update();

## ts_query-Default

my $tsquery = "eisen & (quarz | sand)";

## Testabfrage

my ($ranks_ref, $links_ref) = tsquery($tsquery);

### Disconnect

disconnect_db();

## Testabfrage-Fortsetzung

my %ranks = %$ranks_ref;
my %links = %$links_ref;

print "\nHier sind die Ergebnisse!\n\n";
print map { $_, "\n", $ranks{$_}, "\n", $links{$_}, "\n" } sort { $a cmp $b } keys %ranks;
print "\nFertig!\n\n";

sleep 11;

## Prüfung, ob Datei "sublinks.str" bereits existiert

if (-e "sublinks.str") { goto SUBLINKS2SQL }

## Links zu Sublinks

my $sublinks_ref = links2sublinksplustext(\%links);
my %sublinks = %$sublinks_ref;

#print "\nHier sind die Sublinks!\n\n";
#print map { $_, "\n" } sort { $a cmp $b } keys %sublinks;
#print "\nEs sind ", scalar keys %sublinks, " Sublinks. Fertig!\n\n";

store \%sublinks, 'sublinks.str';

## Sublinks plus Text zu Datenbank

SUBLINKS2SQL:

my $sublinks_ref = retrieve 'sublinks.str';
my %sublinks = %$sublinks_ref;

connect_db();

sublinksplustexts2sql(\%sublinks);


## Testabfrage Sublinks

my ($subranks_ref, $sublinks_ref) = tsquery_sublinks($tsquery);

### Disconnect

disconnect_db();

## Testabfrage-Fortsetzung Sublinks

my %subranks = %$subranks_ref;
my %sublinks = %$sublinks_ref;

print "\nHier sind die Ergebnisse!\n\n";
print map { $_, "\n", $subranks{$_}, "\n", $sublinks{$_}, "\n" } sort { $subranks{$b} <=> $subranks{$a} } keys %subranks;
print "\nFertig!\n\n";

sleep 11;





###########################################################
############### Subroutinen ####################
###########################################################

# Subroutinen

sub connect_db {
    ## Verbindung zur DB herstellen
    $dbh = DBI->connect("DBI:Pg:dbname=links;host=localhost", "$DB_USER", "$DB_PASSWD");
}

sub disconnect_db {
    $dbh->disconnect();
}

sub tsquery {
    print "\n\ntsquery läuft!\n\n";
    my $tsquery = shift;
    my $ranks_query = $dbh->prepare("    SELECT link_id, ts_rank_cd(wordvector, query) AS rank
                                        FROM wordvectors, to_tsquery(?) query
                                        WHERE query @@ wordvector
                                        ORDER BY rank DESC
                                        LIMIT 10;");
    $ranks_query->execute($tsquery);
    my %ranks;
    while ( my @query_row = $ranks_query->fetchrow_array ) {
        my $link_id = $query_row[0];
        my $rank = $query_row[1];
        print "Link: $link_id Rank: $rank\n";
        $ranks{$link_id} = $rank;
    }
    my $links_query = $dbh->prepare("    SELECT link_id, link_name
                                        FROM links
                                        WHERE link_id = ?;");
    my %links;
    foreach ( keys %ranks ) {
        $links_query->execute($_);
        while ( my @query_row = $links_query->fetchrow_array ) {
            my $link_id = $query_row[0];
            my $link = $query_row[1];
            $link = encode('UTF8', $link, Encode::FB_DEFAULT);
            print "Link: $link_id\nURL: $link\n";
            $links{$link_id} = $link;
        }
    }
    return (\%ranks, \%links)
}

sub tsquery_sublinks {
    print "\n\ntsquery_sublinks läuft!\n\n";
    my $tsquery = shift;
    my $ranks_query = $dbh->prepare("    SELECT sublink_id, ts_rank_cd(wordvector, query) AS rank
                                        FROM sublinks, to_tsquery(?) query
                                        WHERE query @@ wordvector
                                        ORDER BY rank DESC;");
    $ranks_query->execute($tsquery);
    my %ranks;
    while ( my @query_row = $ranks_query->fetchrow_array ) {
        my $link_id = $query_row[0];
        my $rank = $query_row[1];
        print "Link: $link_id Rank: $rank\n";
        $ranks{$link_id} = $rank;
    }
    my $links_query = $dbh->prepare("    SELECT sublink_id, sublink_name
                                        FROM sublinks
                                        WHERE sublink_id = ?;");
    my %links;
    foreach ( keys %ranks ) {
        $links_query->execute($_);
        while ( my @query_row = $links_query->fetchrow_array ) {
            my $link_id = $query_row[0];
            my $link = $query_row[1];
            $link = encode('UTF8', $link, Encode::FB_DEFAULT);
            print "Link: $link_id\nURL: $link\n";
            $links{$link_id} = $link;
        }
    }
    return (\%ranks, \%links)
}

sub wordvector_init {
    my $wordvector_create = 'CREATE TABLE IF NOT EXISTS wordvectors
                             AS SELECT link_id, text, to_tsvector(text) AS vector
                             FROM texts WHERE length(text) < 1060000;';
    $dbh->do($wordvector_create) or print $dbh->errstr;
    my $wordvector_alter_table = 'ALTER TABLE wordvectors ADD COLUMN wordvector tsvector;';
    $dbh->do($wordvector_alter_table) or print $dbh->errstr;
    my $wordvector_create_index = 'CREATE INDEX idx_cont_word_vec ON wordvectors USING gin(wordvectors);';
    $dbh->do($wordvector_create_index) or print $dbh->errstr;
}

sub wordvector_update {
    my $wordvector_update = 'UPDATE
                             wordvectors
                             SET
                             wordvector = to_tsvector(text);';
    $dbh->do($wordvector_update) or print $dbh->errstr;
}

# Subroutine links2sublinksplustext

sub links2sublinksplustext {
    my $links_ref = shift;
    my %links = %$links_ref;
    my %sublinks;
    foreach ( keys %links ) {
        my $lynxlinks = `lynx -dump -listonly -nonumbers $links{$_}`;
        my @lynxlinks = split ("\n", $lynxlinks);
        foreach ( @lynxlinks ) {
            my $sublink = $_;
            $sublink =~ s/\(/\\(/g;
            $sublink =~ s/\)/\\)/g;
            if ( $_ =~ /^www.*|^https*.*/m ) {
                print "Sublink:\n$sublink\nwird vertextet!\n";
                $sublinks{$_} = `lynx -dump -nolist $sublink`
            }
        }
    }
    return \%sublinks
}

# Subroutine sublinks2sql

sub sublinksplustexts2sql {
    my $sublinksplustexts_ref = shift;
    my %sublinksplustexts = %$sublinksplustexts_ref;
    my $sublinkstable_create = 'CREATE TABLE IF NOT EXISTS sublinks
                                ( sublink_id SERIAL,
                                  sublink_name VARCHAR(555) UNIQUE,
                                  text TEXT,
                                  wordvector TSVECTOR );';
    $dbh->do($sublinkstable_create) or print $dbh->errstr;
    my $sublinks_insert = $dbh->prepare('INSERT INTO sublinks (sublink_name,text,wordvector) VALUES (?,?,to_tsvector(?)) ON CONFLICT DO NOTHING;');
    foreach ( keys %sublinksplustexts ) {
        my $sublink = $_;
        my $text = $sublinksplustexts{$_};
        if ( length($text) > 1060000 ) { next }
        eval{$text = decode('utf8', $text, Encode::FB_DEFAULT)};
        $sublinks_insert->execute($sublink,$text,$text) or print $dbh->errstr;
    }
}


# Subroutine Date

sub date {
    my $year = (localtime((time)))[5] + 1900;
    my $month = (localtime((time)))[4] + 1;
    my $mday = (localtime((time)))[3];
    my $date = $year.'-'.$month.'-'.$mday;
    return $date;
}
Funzt zwar, aber ich finde, daß das zu unsauber programmiert ist. Trotzdem geht's gleich erstmal ohne Cleaningversuche weiter.

By the way, es gibt da auch noch ein Perl-Modul:

Im Moment funzt es aber auch so ganz gut.

 

Output - wesentliche Ausschnitte


tsquery läuft!

Link: 26227 Rank: 0.1
Link: 15343 Rank: 0.1
Link: 5041 Rank: 0.1
Link: 9661 Rank: 0.00769231
Link: 11235 Rank: 0.00390608
Link: 3712 Rank: 0.00240396
Link: 26706 Rank: 0.00179138
Link: 13078 Rank: 0.000716998
Link: 22367 Rank: 0.000539567
Link: 24491 Rank: 0.0003125


tsquery_sublinks läuft!

Link: 549 Rank: 0.1
Link: 1482 Rank: 0.1
Link: 1815 Rank: 0.1
Link: 1167 Rank: 0.1
Link: 994 Rank: 0.0525603
Link: 1334 Rank: 0.0333021
Link: 1237 Rank: 0.0200574
Link: 1684 Rank: 0.0196122
Link: 569 Rank: 0.0169173
Link: 593 Rank: 0.0148093
Link: 567 Rank: 0.0146654
Link: 1207 Rank: 0.0130093
Link: 310 Rank: 0.0125567
Link: 662 Rank: 0.00981997
Link: 292 Rank: 0.00833333
Link: 2076 Rank: 0.00769231
Link: 749 Rank: 0.00769231
...
Link: 2217 Rank: 0.00769231
Link: 1654 Rank: 0.00769231
Link: 1179 Rank: 0.00769231
Link: 137 Rank: 0.00769231
Link: 1220 Rank: 0.00769231
Link: 192 Rank: 0.00769231
Link: 195 Rank: 0.00769231
Link: 1279 Rank: 0.00635011
Link: 282 Rank: 0.00576972
Link: 677 Rank: 0.00418871
Link: 1871 Rank: 0.00390608
Link: 2267 Rank: 0.00390608
Link: 646 Rank: 0.00390608
...
Link: 1832 Rank: 0.00390608
Link: 1830 Rank: 0.00390608
Link: 1277 Rank: 0.00390608
Link: 44 Rank: 0.00384615
Link: 120 Rank: 0.0031659
Link: 85 Rank: 0.00294118
Link: 1822 Rank: 0.00284848
...
Link: 1856 Rank: 7.86164e-05
Link: 640 Rank: 6.62252e-05
Link: 1285 Rank: 6.03136e-05
Link: 308 Rank: 3.74953e-05
Link: 1108 Rank: 3.3389e-05

Ab hier stellt sich mir die Aufgabe, herauszufinden, welche Sublinks es wert sind, in die Link-Tabelle übernommen zu werden.
Oder - alternativ - welche Links (die Fund-Links + die Sublinks ab einem gewissen Wert) in eine separate Tabelle untergebracht werden sollten, könnten oder gar sogar müssten.

... I will see, later on.

...

Neuer Durchlauf (noch ohne Veränderung):

my $tsquery = "(overload | meltdown) & (autist | autismus | asperger)";

( Läuft jetzt ca. 20 bis 40 Minuten - Endlich Pause! :-) )

...

Idee!
(Pause fällt aus ;-) )

Der Abstand zwischen dem Rankmax und Rankmin der besten 10 Treffer, geteilt durch zwei und dann abgezogen vom Rankmax, soll es richten! Auf diese Art dürfte sich die Datenbanktabelle mit der Zeit mit immer wertvolleren Links anreichern. Oder ist das eine Milchmädchen- oder -bübchen-Rechnung?

Oder ich verzichte auf diese Art Zensur. Denn iwi sehe ich, daß bei der jetzigen Sublinks-Erstellung eine Menge Holz gemacht wird (oder anfällt?) - bloß vielleicht nicht alles gut genug, wenn unter dem Aspekt der ursprünglichen tsquery betrachtet, sonst iwi schon ... Zweifel, zweifel ... Warum auf soviel Gutes verzichten, was doch bei anderen Queries relevant sein/werden könnte? Wäre doch iwi deppert, dünkt oder deucht mir grade. Grade mal so eben so.

...

Jo, die Ausbeute ist eigentlich viel zu gut für Wegschmiß. Ich sollte mir lieber Gedanken über mehr Festplattenspeicherplatz für meine Datenbank machen, scheint mir sinnvoller.
( "viel zu gut" - bei dem, was ich hier grade so durchlaufen sehe, wäre "genial" schon passender, das topt jede Google-Suche (selbstverständlich nicht in Sachen Geschwindigkeit, klar, klar) )
...

Okay, vielleicht gibt es aber trotzdem ein gewisses "Spreu vom Weizen"-Trennkriterium. Weil "Spreu" ja nun mal nicht als "Weizen" zu gebrauchen ist. Mal kurz noch das Ende der Sublinkserstellung abwarten ...

...

OMG - das ist ja fast schon wie das Öffnen der Büchse der Pandora (oder wie die heißt)!

tsquery läuft!

Link: 16477 Rank: 1.44772
Link: 4945 Rank: 0.496308
Link: 5766 Rank: 0.37686
Link: 1760 Rank: 0.371749
Link: 16752 Rank: 0.217921
Link: 6650 Rank: 0.210509
Link: 4460 Rank: 0.194111
Link: 13246 Rank: 0.169834
Link: 1961 Rank: 0.165375
Link: 8414 Rank: 0.149493
Link: 7458 Rank: 0.149493

tsquery_sublinks läuft!
Sublink: 2477, Nr. 1, Rank: 1.67434
Sublink: 1520, Nr. 2, Rank: 1.67434
Sublink: 1784, Nr. 3, Rank: 1.67434
Sublink: 2202, Nr. 4, Rank: 1.67434
Sublink: 614, Nr. 5, Rank: 1.67434
Sublink: 1124, Nr. 6, Rank: 1.67434
Sublink: 2221, Nr. 7, Rank: 1.67434
Sublink: 2518, Nr. 8, Rank: 1.67434
Sublink: 48, Nr. 9, Rank: 1.67434
Sublink: 2473, Nr. 10, Rank: 0.540029
Sublink: 1203, Nr. 11, Rank: 0.496308
Sublink: 1425, Nr. 12, Rank: 0.496308
Sublink: 2080, Nr. 13, Rank: 0.48124
Sublink: 1052, Nr. 14, Rank: 0.400136
Sublink: 1843, Nr. 15, Rank: 0.37686
Sublink: 704, Nr. 16, Rank: 0.37686
Sublink: 1311, Nr. 17, Rank: 0.37167
Sublink: 506, Nr. 18, Rank: 0.37167
Sublink: 1760, Nr. 19, Rank: 0.293145
Sublink: 2196, Nr. 20, Rank: 0.277917
Sublink: 831, Nr. 21, Rank: 0.273333
Sublink: 1038, Nr. 22, Rank: 0.270997
Sublink: 794, Nr. 23, Rank: 0.269884
Sublink: 1257, Nr. 24, Rank: 0.261893
Sublink: 90, Nr. 25, Rank: 0.261893
Sublink: 1886, Nr. 26, Rank: 0.24667
Sublink: 1954, Nr. 27, Rank: 0.223893
Sublink: 114, Nr. 28, Rank: 0.217921
Sublink: 328, Nr. 29, Rank: 0.217921
Sublink: 414, Nr. 30, Rank: 0.217921
Sublink: 2239, Nr. 31, Rank: 0.217921
Sublink: 2100, Nr. 32, Rank: 0.217921
Sublink: 712, Nr. 33, Rank: 0.217921
...
Sublink: 2247, Nr. 568, Rank: 0.0219429
Sublink: 203, Nr. 569, Rank: 0.0210986
Sublink: 158, Nr. 570, Rank: 0.0208929
Sublink: 428, Nr. 571, Rank: 0.0207407
Sublink: 412, Nr. 572, Rank: 0.0201923
Sublink: 1881, Nr. 573, Rank: 0.0201923
Sublink: 540, Nr. 574, Rank: 0.0201466
Sublink: 1422, Nr. 575, Rank: 0.0200683
Sublink: 216, Nr. 576, Rank: 0.0191028
Sublink: 66, Nr. 577, Rank: 0.0188359
Sublink: 548, Nr. 578, Rank: 0.0188359
Sublink: 1236, Nr. 579, Rank: 0.0187841
Sublink: 2213, Nr. 580, Rank: 0.0187707
Sublink: 91, Nr. 581, Rank: 0.0187396
...
Sublink: 109, Nr. 961, Rank: 0.000320863
Sublink: 2167, Nr. 962, Rank: 0.000306036
Sublink: 1072, Nr. 963, Rank: 0.000297087
Sublink: 1935, Nr. 964, Rank: 0.000289547
Sublink: 646, Nr. 965, Rank: 0.000286278
Sublink: 2051, Nr. 966, Rank: 0.000280788
Sublink: 798, Nr. 967, Rank: 0.0002734
Sublink: 1901, Nr. 968, Rank: 0.000267741
Sublink: 1518, Nr. 969, Rank: 0.000266886
Sublink: 2016, Nr. 970, Rank: 0.000262321
Sublink: 2019, Nr. 971, Rank: 0.000261782
Sublink: 1315, Nr. 972, Rank: 0.000259604
Sublink: 100, Nr. 973, Rank: 0.000258182
Sublink: 1338, Nr. 974, Rank: 0.000252656
Sublink: 1245, Nr. 975, Rank: 0.000252073
Sublink: 654, Nr. 976, Rank: 0.000246338
Sublink: 1647, Nr. 977, Rank: 0.000239913
Sublink: 1387, Nr. 978, Rank: 0.000237558
Sublink: 552, Nr. 979, Rank: 0.00023703
Sublink: 1782, Nr. 980, Rank: 0.000235313
Sublink: 807, Nr. 981, Rank: 0.000203288
Sublink: 1759, Nr. 982, Rank: 0.000202629
Sublink: 184, Nr. 983, Rank: 0.000196144
Sublink: 78, Nr. 984, Rank: 0.000195819
Sublink: 661, Nr. 985, Rank: 0.000194065
Sublink: 1219, Nr. 986, Rank: 0.000186107
Sublink: 1103, Nr. 987, Rank: 0.000182519
Sublink: 2478, Nr. 988, Rank: 0.000180689
Sublink: 1545, Nr. 989, Rank: 0.000176701
Sublink: 1244, Nr. 990, Rank: 0.00016549
Sublink: 1871, Nr. 991, Rank: 0.000164407
Sublink: 1147, Nr. 992, Rank: 0.000163202
Sublink: 590, Nr. 993, Rank: 0.000161693
Sublink: 2255, Nr. 994, Rank: 0.000149923
Sublink: 1862, Nr. 995, Rank: 0.000148871
Sublink: 2125, Nr. 996, Rank: 0.000141609
Sublink: 640, Nr. 997, Rank: 0.000129416
Sublink: 1410, Nr. 998, Rank: 0.000127899
Sublink: 710, Nr. 999, Rank: 0.000125921
Sublink: 183, Nr. 1000, Rank: 0.000125155
Sublink: 2020, Nr. 1001, Rank: 0.000120683
Sublink: 554, Nr. 1002, Rank: 7.57936e-05
Wie des öfteren in letzter Zeit: Fast zu schön, um wahr zu sein. Aber is' wahr.

 

Probe ad exempullum

SELECT sublink_id, text, ts_rank_cd(wordvector, query) AS rank
FROM sublinks, to_tsquery('(overload | meltdown) & (autist | autismus | asperger)') query
WHERE query @@ wordvector AND ts_rank_cd(wordvector, query) < 0.00023703
ORDER BY rank DESC;

Uff!
In diesem (vielleicht zu speziellem) Fall ist sogar noch der letztplatzierte Text kein Ausschuss. Jetzt habe ich die Qual der Wahl. Sicher ist auf jeden Fall, daß ich diese Ausbeute vollständig in meine Links- und Text-Tabellen übergeben werde. Am Besten schreibe ich das Programm schon mal soweit weiter, daß das am Ende auf Nachfrage mit anschließender Bestätigung automatisch ablaufen kann.

...

So. Soweit. Ich bin.
Ehrlich gesagt, erwarte ich, daß mir das um die Ohren fliegt:

sub links_texts_insert {
    my $sublinks_ref = shift;
    my %sublinks = %$sublinks_ref;
    foreach ( keys %sublinks ) {
        my $sublink_id = $_;
        my $link = $sublinks{$_};
        my $link_upsert = $dbh->prepare("INSERT INTO links (link_id, link_name, fdate) VALUES ((select link_id FROM links ORDER BY link_id DESC LIMIT 1)+1    , ?, ?) ON CONFLICT (link_name) DO UPDATE SET ldate=?;");
        my $link_id_query = $dbh->prepare('SELECT link_id FROM links WHERE link_name LIKE ?;');
        $link_id_query->execute($link);
        my $link_id = $link_id_query->fetchrow;
        my $insert_ok = $link_upsert->execute($link_id,$link,date(),date());
        if ( $insert_ok ) {
            if ($insert_ok eq '0E0') {
                # no rows updated
            } else {
            # rows updated
                my $link_id_query = $dbh->prepare('SELECT link_id FROM links WHERE link_name LIKE ?;');
                $link_id_query->execute($link);
                my $link_id = $link_id_query->fetchrow;
                my $links2texts_upsert = $dbh->prepare("INSERT INTO links2texts (link_id) VALUES (?) ON CONFLICT (link_id) DO NOTHING;");
                $links2texts_upsert->execute($link_id);
                my $gettext_query = $dbh->prepare('SELECT text FROM sublinks WHERE sublink_id = ?');
                my $link2text_upsert = $dbh->prepare("INSERT INTO texts (link_id, text, fdate) VALUES (?, (SELECT text FROM sublinks WHERE sublink_id = ?), ?) ON CONFLICT (link_id) DO NOTHING;");
                my $links2texts_update = $dbh->prepare("UPDATE links2texts SET text_created = ?, fdate = ? WHERE link_id = ?;");
                $gettext_query->execute($sublink_id);
                $link2text_upsert->execute($link_id,$sublink_id,date());
                $links2texts_update->execute('1',date(),$link_id);
            }
        } else { print "\nERROR!!!\n"; sleep 11 }
    }
    #wortvector_insert_new();
    #wortvector_update();
}

Beim ersten Mal. Denn die Konzentration hat etwas nachgelassen. Ist schon 22:38h.
Also kurz einen Datenbank-Dump, dann einfach ausprobieren!

( obiges zweimal nachgebessert )

...

Fertig!


Sollen ALLE Funde (ohne Auswahl/Einschränkung) in die links- und texts-Tabelle übergeben werden? (ja/n)
...

Jetzt kommt die Minute der Wahrheit, ich bestätige mal mit "ja".

...

ja
DBD::Pg::st execute failed: Cannot call execute on a disconnected database handle at tsquery_tsrank.pl line 214, <STDIN> line 1.
DBD::Pg::st fetchrow failed: no statement executing at tsquery_tsrank.pl line 215, <STDIN> line 1.
DBD::Pg::st execute failed: called with 4 bind variables when 3 are needed at tsquery_tsrank.pl line 216, <STDIN> line 1.

ERROR!!!
...
Ein ERROR nach dem anderen, tja.

Jo, Fehler klar. Hoffentlich war's nur der eine.


sub links_texts_insert {
    my $sublinks_ref = shift;
    my %sublinks = %$sublinks_ref;
    foreach ( keys %sublinks ) {
        my $sublink_id = $_;
        my $link = $sublinks{$_};
        my $link_upsert = $dbh->prepare("INSERT INTO links (link_id, link_name, fdate) VALUES ((select link_id FROM links ORDER BY link_id DESC LIMIT 1)+1    , ?, ?) ON CONFLICT (link_name) DO UPDATE SET ldate=?;");
        my $link_id_query = $dbh->prepare('SELECT link_id FROM links WHERE link_name LIKE ?;');
        my $insert_ok = $link_upsert->execute($link,date(),date());
        if ( $insert_ok ) {
            if ($insert_ok eq '0E0') {
                # no rows updated
            } else {
            # rows updated
                my $link_id_query = $dbh->prepare('SELECT link_id FROM links WHERE link_name LIKE ?;');
                $link_id_query->execute($link);
                my $link_id = $link_id_query->fetchrow;
                my $links2texts_upsert = $dbh->prepare("INSERT INTO links2texts (link_id) VALUES (?) ON CONFLICT (link_id) DO NOTHING;");
                $links2texts_upsert->execute($link_id);
                my $gettext_query = $dbh->prepare('SELECT text FROM sublinks WHERE sublink_id = ?');
                my $link2text_upsert = $dbh->prepare("INSERT INTO texts (link_id, text, fdate) VALUES (?, (SELECT text FROM sublinks WHERE sublink_id = ?), ?) ON CONFLICT (link_id) DO NOTHING;");
                my $links2texts_update = $dbh->prepare("UPDATE links2texts SET text_created = ?, fdate = ? WHERE link_id = ?;");
                $gettext_query->execute($sublink_id);
                $link2text_upsert->execute($link_id,$sublink_id,date());
                $links2texts_update->execute('1',date(),$link_id);
            }
        } else { print "\nERROR!!!\n"; sleep 11 }
    }
    #wortvector_insert_new();
    #wortvector_update();
}

Sollen ALLE Funde (ohne Auswahl/Einschränkung) in die links- und texts-Tabelle übergeben werden? (ja/n)

ja
DBD::Pg::st execute failed: Cannot call execute on a disconnected database handle at tsquery_tsrank.pl line 214, <STDIN> line 1.

ERROR!!!
DBD::Pg::st execute failed: Cannot call execute on a disconnected database handle at tsquery_tsrank.pl line 214, <STDIN> line 1.

ERROR!!!
DBD::Pg::st execute failed: Cannot call execute on a disconnected database handle at tsquery_tsrank.pl line 214, <STDIN> line 1.

ERROR!!!
...

Übel, übel. Bin ich schon so unaufmerksam, mittlerweile?

if ( $ok eq "ja" ) { connect_db(); links_texts_insert(\%sublinks); print "\nÜbergabe erfolgt!\n\n"; disconnect_db()}

Naja, immerhin war's dadurch bis jetzt sicher, daß noch nix passieren konnte. Jetzt aber! Let's give it another try!

Sollen ALLE Funde (ohne Auswahl/Einschränkung) in die links- und texts-Tabelle übergeben werden? (ja/n)

ja

Jetzt bleibt es gespenstisch ruhig. Abwarten, hoffen, beten.

Übergabe erfolgt!
Was zu überprüfen wäre. Nein, ist. Aber (jetzt schon gesagt): fein, fein!

SELECT count(link_id) FROM links;

27999
SELECT count(link_id) FROM links2texts;

27999

SELECT count(link_id) FROM texts;

27961

Wie sacht man/fra so schön? Hi, hi.

SELECT max(link_id) FROM texts;

27999

Ätsch.

... und da wußte ich doch mal genau, wie ...

MINUS funzt bei Postgres nicht, dafür flurrzt:

SELECT link_id FROM links
EXCEPT
SELECT link_id FROM texts
ORDER BY link_id;

"link_id"
328
425
555
867
1356
1725
1868
1929
2812
3234
4273
4457
4530
4693
6201
6397
6990
8111
8144
8759
9081
9373
9605
10227
10801
11328
11721
12197
12268
12314
12523
12590
12624
18580
20505
21708
23418
25965
Wenn ich richtig aufgepasst habe, sind das alles "Schätzchen" von früher/vorher. Ach, das müsste eigentlich sogar ersichtlich werden, wenn:

SELECT
link_id,
fdate,
ldate
FROM links
WHERE link_id IN
(
SELECT link_id FROM links
EXCEPT
SELECT link_id FROM texts
ORDER BY link_id
);

"link_id";"fdate";"ldate"
328;"2018-11-1";""
425;"2018-11-1";"2018-11-16"
555;"2018-11-1";"2018-11-16"
867;"2018-11-1";"2018-11-16"
1356;"2018-11-1";"2018-11-16"
1725;"2018-11-1";"2018-11-16"
1868;"2018-11-1";"2018-11-16"
1929;"2018-11-1";"2018-11-16"
2812;"2018-11-1";"2018-11-16"
3234;"2018-11-1";"2018-11-16"
4273;"2018-11-1";"2018-11-16"
4457;"2018-11-1";"2018-11-16"
4530;"2018-11-1";"2018-11-16"
4693;"2018-11-1";"2018-11-16"
6201;"2018-11-1";"2018-11-16"
6397;"2018-11-1";"2018-11-16"
6990;"2018-11-1";"2018-11-16"
8144;"2018-11-1";"2018-11-16"
8111;"2018-11-1";"2018-11-16"
8759;"2018-11-1";"2018-11-16"
9081;"2018-11-1";"2018-11-16"
9373;"2018-11-1";"2018-11-16"
9605;"2018-11-1";"2018-11-16"
10227;"2018-11-1";"2018-11-16"
10801;"2018-11-1";"2018-11-16"
11328;"2018-11-1";"2018-11-16"
11721;"2018-11-1";"2018-11-16"
12197;"2018-11-6";"2018-11-16"
12268;"2018-11-6";"2018-11-16"
12523;"2018-11-6";"2018-11-16"
12590;"2018-11-6";"2018-11-16"
12624;"2018-11-6";"2018-11-16"
18580;"2018-11-7";""
20505;"2018-11-7";""
21708;"2018-11-7";""
23418;"2018-11-7";""
25965;"2018-11-14";"2018-11-16"
12314;"2018-11-6";"2018-11-16"
Sieht ja sehr gut aus!

Und da bin habe ich versehentlich auf einen Reiter geklickt, noch gar nicht bemerkt, das:


Ist doch einfach sagenhaft, was für Möglichkeiten eifim zur Verfügung stehen, wenn fim sich mal ein bisschen mehr anstrengt als sonst! Kostet (fast) nix weiter als ein eigenes Bemühen (z.B. das Stöbern in meist englischsprachigen Foren uso). Oder so ungefähr jedenfalls.

 

Sponti-Test

SELECT
link_id,
fdate,
ldate
FROM links
WHERE fdate = '2018-11-24';

"link_id";"fdate";"ldate"
27150;"2018-11-24";""
27030;"2018-11-24";""
27010;"2018-11-24";""
27011;"2018-11-24";""
27012;"2018-11-24";""
27013;"2018-11-24";""
27014;"2018-11-24";""
...

Und jetzt lass' ich's einfach nochmal laufen!

Sollen ALLE Funde (ohne Auswahl/Einschränkung) in die links- und texts-Tabelle übergeben werden? (ja/n)

ja
Spannung! Ich hab' vorher nicht gecheckt, ob ...

Übergabe erfolgt!
... ob ich das Update- oder Upsert-Statement mit dem ldate berücksichtigt habe (glaube zwar schon, weiß aber noch nicht) ...

"link_id";"fdate";"ldate"
27013;"2018-11-24";"2018-11-24"
27026;"2018-11-24";"2018-11-24"
27027;"2018-11-24";"2018-11-24"
27025;"2018-11-24";"2018-11-24"
...

Yap!

Und für Spaß warte ich noch kurz 6 Minuten ...

SELECT
link_id
FROM texts
WHERE link_id IN
(
SELECT link_id FROM texts
EXCEPT
SELECT link_id FROM wordvectors
ORDER BY link_id
);

Damit müsste sich die wordvectors-Tabelle upserten lassen, aber erst ( 6 Minuten sind rum! ):

"link_id";"fdate";"ldate"
27029;"2018-11-24";"2018-11-25"
27011;"2018-11-24";"2018-11-25"
27012;"2018-11-24";"2018-11-25"
27026;"2018-11-24";"2018-11-25"
27027;"2018-11-24";"2018-11-25"
27022;"2018-11-24";"2018-11-25"
27024;"2018-11-24";"2018-11-25"
27028;"2018-11-24";"2018-11-25"
27023;"2018-11-24";"2018-11-25"
27020;"2018-11-24";"2018-11-25"
...

Alles andere wäre auch eine arge Enttäuschung gewesen :-).

Besser als Trockenübung durchzuexerzieren:

INSERT
INTO wordvectors (link_id,text)
SELECT link_id,text
FROM texts
WHERE link_id IN
(
SELECT link_id FROM texts
EXCEPT
SELECT link_id FROM wordvectors
ORDER BY link_id
);

Query returned successfully: 995 rows affected, 13.1 secs execution time.
Looks nice. ( kurz mal uff's Klo, mom!)(*)
(* Ich stehe in regem Austausch mit meiner Website, dialogistisch, pseudo-.)

Ja, an sich dürfte nix schieflaufen können, weil nur die Links & Texts reingebeamt werden, die noch nicht drin sind. Also implementieren!

Gebongt. Nun nur noch:

sub wordvector_update {
    my $wordvector_update = 'UPDATE
                             wordvectors
                             SET
                             wordvector = to_tsvector(text)
                             WHERE wordvector IS NULL;';
    $dbh->do($wordvector_update) or print $dbh->errstr;
}

Wow!
Das müßte es schon gewesen sein, für heute. Alle Ziele erreicht! Mehr wollte ich heut' nicht.

Letzter Check

...
Scalar found where operator expected at tsquery_tsrank.pl line 263, near "$dbh"
  (Might be a runaway multi-line '' string starting on line 252)
    (Missing semicolon on previous line?)
syntax error at tsquery_tsrank.pl line 263, near "$dbh"
Global symbol "$wordvector_insert_new" requires explicit package name (did you forget to declare "my $wordvector_insert_new"?) at tsquery_tsrank.pl line 263.
Execution of tsquery_tsrank.pl aborted due to compilation errors.
Ein kleiner Schlamper, nehme ich an ... Jo, Semikolon vergessen. Kutt für.

SELECT
*
FROM wordvectors
WHERE link_id
IN
(
SELECT link_id
FROM links
WHERE fdate = '2018-11-24'
)
;

Total query runtime: 3.0 secs
990 Zeilen geholt.

SELECT link_id FROM links
EXCEPT
SELECT link_id FROM texts
ORDER BY link_id;

Total query runtime: 328 msec
38 Zeilen geholt.

SELECT link_id FROM links
EXCEPT
SELECT link_id FROM wordvectors
ORDER BY link_id;

Total query runtime: 44 msec
38 Zeilen geholt.
Auch wenn es daraus nicht hervorgeht: Ich weiß, was noch fehlt.


sub wordvector_update {
    my $wordvector_update = 'UPDATE
                             wordvectors
                             SET
                             wordvector = to_tsvector(text)
                             WHERE wordvector IS NULL AND length(text) < 1060000;';
    $dbh->do($wordvector_update) or print $dbh->errstr;
}

Jetzt sollte es passen.

Oh, es fehlt noch was!

Nein, das mache ich erst morgen, in aller Ruhe. Die Sublinks-Tabelle sollte normalerweise nach jedem Durchlauf gedropped werden. Vielleicht lasse ich das aber auch nicht automatisch geschehen, sondern lasse danach fragen ... lol, was für eine Ausdrucksweise, heut' abend ... nacht.

Zum Schluß interessiert mich logischerweise, wieviele Links eventuell dazukommen, wenn ich dieselbe Abfrage noch einmal, und jetzt über die upgedateteten (sic!) Tabellen laufen lasse. Das Droppen erledige ich vorher manuell.

Let's have fun, again! Let's go!

... läuft ja jetzt ein Weilchen, 00:57h ...

Wo ich das so sehe: Sinnvoller wäre es, die Sublinks, die bereits in der Tabelle stehen, vor Vertextung und Tabellen-Einschreibung aus dem Sublink-Hash zu entfernen. Ach, morgen ist auch noch ein Tach! (Alt.: "Ach, Morgen ist auch noch ein Tach!"? Fragen über Fragen ... ;-) )

...

Hui!
Da kommt deutlich mehr bei rum als erwartet!

SELECT sublink_id, sublink_name, text, wordvector
  FROM public.sublinks;


Total query runtime: 8.7 secs
2534 Zeilen geholt.

SELECT sublink_id, ts_rank_cd(wordvector, query) AS rank
FROM sublinks, to_tsquery('(overload | meltdown) & (autist | autismus | asperger)') query
WHERE query @@ wordvector
ORDER BY rank DESC;

Total query runtime: 116 msec
1003 Zeilen geholt.

SELECT sublink_name AS link FROM sublinks
EXCEPT
SELECT link_name AS link FROM links
ORDER BY link;

Total query runtime: 288 msec
1648 Zeilen geholt.



Sollen ALLE Funde (ohne Auswahl/Einschränkung) in die links- und texts-Tabelle übergeben werden? (ja/n)

n
Nach einer längeren Mütze Schlaf erst ;-) .


Fazit:

Ich bin mehr als zufrieden. Endlich nähert es sich dem an, was ich mir schon vor Jahren vage vorgestellt habe, was mein sog. Tomxtoskop an Grundfunktionalitäten bieten können sollte. Oder zumindest geht es jetzt deutlicher in die (wahrscheinlich) richtige Richtung. Naja, schau'n mer mal. Für diesmal war's jedenfalls mal richtig gut. Supi!

Good Night!






Update:


Das sei Wahnsinn!


Warum schickt es mich in den Himmel?

Noch vor wenigen Stunden die erste, jetzt: die nächste Schallmauer durchbrochen!

 


 
Beispiel:
 

SELECT alias, description, token FROM ts_debug(
(SELECT
text
FROM
wordvectors
WHERE link_id = 11555)
);


...
"asciiword";"Word, all ASCII";"Facebook"
"blank";"Space symbols";": "
"asciiword";"Word, all ASCII";"Zum"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"Profil"
"blank";"Space symbols";"
     * "
"asciiword";"Word, all ASCII";"Webseite"
"blank";"Space symbols";": "
"protocol";"Protocol head";"http://"
"host";"Host";"www.freitag.de"
"blank";"Space symbols";"/

   "
"asciiword";"Word, all ASCII";"Mehr"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"Artikel"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"von"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"Jakob"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"Augstein"
"blank";"Space symbols";"
   "
...
"asciiword";"Word, all ASCII";"die"
"blank";"Space symbols";" "
"word";"Word, all letters";"Grünen"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"vom"
"blank";"Space symbols";" "
"word";"Word, all letters";"Wähler"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"reich"
"blank";"Space symbols";"
   "
"asciiword";"Word, all ASCII";"beschenkt"
"blank";"Space symbols";", "
"asciiword";"Word, all ASCII";"und"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"die"
"blank";"Space symbols";" "
"asciihword";"Hyphenated word, all ASCII";"GroKo-Parteien"
"hword_asciipart";"Hyphenated word part, all ASCII";"GroKo"
"blank";"Space symbols";"-"
"hword_asciipart";"Hyphenated word part, all ASCII";"Parteien"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"SPD"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"und"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"CSU"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"mussten"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"bitter"
"blank";"Space symbols";" "
"word";"Word, all letters";"büßen"
"blank";"Space symbols";".
   "
"asciiword";"Word, all ASCII";"Selber"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"Schuld"
"blank";"Space symbols";".
...

 
onda anderer Text:


...
   "
"blank";"Space symbols";"+ "
"uint";"Unsigned integer";"3"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"weitere"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"Antworten"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"anzeigen"
"blank";"Space symbols";"

   "
"asciiword";"Word, all ASCII";"Kommentarseiten"
"blank";"Space symbols";"
   "
"asciiword";"Word, all ASCII";"Weitere"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"Kommentare"
"blank";"Space symbols";"
     * "
"uint";"Unsigned integer";"1"
"blank";"Space symbols";"
     * "
"uint";"Unsigned integer";"2"
"blank";"Space symbols";"
     * "
"uint";"Unsigned integer";"3"
"blank";"Space symbols";"
     * "
"uint";"Unsigned integer";"4"
"blank";"Space symbols";"
     * "
"uint";"Unsigned integer";"5"
"blank";"Space symbols";"
     * "
"uint";"Unsigned integer";"6"
"blank";"Space symbols";"

   "
"asciiword";"Word, all ASCII";"Bitte"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"melden"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"Sie"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"sich"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"an"
"blank";"Space symbols";", "
"asciiword";"Word, all ASCII";"um"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"zu"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"kommentieren"
"blank";"Space symbols";".
   "
"asciiword";"Word, all ASCII";"Anmelden"
"blank";"Space symbols";" "
"asciiword";"Word, all ASCII";"Registrieren"
"blank";"Space symbols";"

     * "
...


onda:
 

SELECT * FROM ts_debug(
(SELECT
text
FROM
wordvectors
WHERE link_id = 12345)
);
 

"alias";"description";"token";"dictionaries";"dictionary";"lexemes"
...
"hword";"Hyphenated word, all letters";"NRW-Ministerpräsident";"{german_stem}";"german_stem";"{nrw-ministerprasident}"
"hword_asciipart";"Hyphenated word part, all ASCII";"NRW";"{german_stem}";"german_stem";"{nrw}"
"blank";"Space symbols";"-";"{}";"";""
"hword_part";"Hyphenated word part, all letters";"Ministerpräsident";"{german_stem}";"german_stem";"{ministerprasident}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"Armin";"{german_stem}";"german_stem";"{armin}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"Laschet";"{german_stem}";"german_stem";"{laschet}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"finde";"{german_stem}";"german_stem";"{find}"
"blank";"Space symbols";", ";"{}";"";""
"asciiword";"Word, all ASCII";"dass";"{german_stem}";"german_stem";"{dass}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"der";"{german_stem}";"german_stem";"{}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"Stil";"{german_stem}";"german_stem";"{stil}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"im";"{german_stem}";"german_stem";"{}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"Umgang";"{german_stem}";"german_stem";"{umgang}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"mit";"{german_stem}";"german_stem";"{}"
"blank";"Space symbols";"
       ";"{}";"";""
"asciiword";"Word, all ASCII";"dem";"{german_stem}";"german_stem";"{}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"Fall";"{german_stem}";"german_stem";"{fall}"
"blank";"Space symbols";" ";"{}";"";""
"word";"Word, all letters";"Maaßen";"{german_stem}";"german_stem";"{maass}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"ein";"{german_stem}";"german_stem";"{}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"Ende";"{german_stem}";"german_stem";"{end}"
"blank";"Space symbols";" ";"{}";"";""
"asciiword";"Word, all ASCII";"haben";"{german_stem}";"german_stem";"{}"
"blank";"Space symbols";" ";"{}";"";""
"word";"Word, all letters";"müsse";"{german_stem}";"german_stem";"{muss}"
"blank";"Space symbols";"
...

 
Da hab' ich doch bald alles zusammen, was ich brauche!
Die Text-Search-Functions von/in PostgreSQL sind der Knallhammar!!



Lol. ( gut, datt ich nochma vonn' Nachtpott anne PC jejangen bin, woll?! )












Kommentare

Beliebte Posts aus diesem Blog

·

Es brennt.

Bye, bye Nord Stream 2!