2016-04-20 8 views
1

Ich führe eine gewichtete Suche auf einer Reihe von Elementen in einer E-Commerce-Plattform durch. Das Problem, das ich habe, ist ts_rank, das mir genau denselben Wert für verschiedene Kombinationen von Wörtern gibt, auch wenn der ts_vector verschiedene Positionen für jeden Satz von Wörtern gibt.PostgreSQL - machen ts_rank die ts_vector-Position nehmen wie sie ist oder eine benutzerdefinierte ts_rank-Funktion definieren

Lassen Sie mich dies illustrieren mit einem Beispiel:

Wenn ich ts_vector das Wort camas geben, es gibt mir folgendes:

'cam':1 

Wenn ich ts_vector das Wort geben sofas camas, es gibt mir die folgende :

'cam':2 'sof':1 

So wird camas verschiedenen Positionen immer auf die Worte Kombination abhängig.

Wenn ich die folgende Anweisung:

select ts_rank(to_tsvector('camas'),to_tsquery('spanish','cama')); 

PostgreSQL gibt mir 0.0607927 als ts_rank berechneten Wert, während der berechnete Wert für die folgende Erklärung ab:

select ts_rank(to_tsvector('sofas camas'),to_tsquery('spanish','cama')); 

ist der gleiche Wert: 0.0607927 .

Wie kann das sein? Die Frage, die mir in den Sinn kommt, ist folgende: Gibt es eine Möglichkeit für ts_rank, die Position der in der ts_vector-Struktur enthaltenen Wörter so zu betrachten, wie sie ist, oder gibt es eine Möglichkeit, eine benutzerdefinierte ts_rank-Funktion zu definieren die Position für die Wörter wie erklärt?

Jede Hilfe würde sehr geschätzt werden.

Antwort

3

Als documentation sais über Funktionen ts_rank und ts_rank_cd:

sie überlegen, wie oft die Abfragebegriffe in dem Dokument erscheinen, wie nahe beieinander die Begriffe in dem Dokument sind und wie wichtig ist der Teil des Dokuments, in dem sie auftreten

Das sind diese Funktionen ignorieren andere Wörter in der Berechnung. Zum Beispiel können Sie unterschiedliche Ergebnisse für diese Abfragen erhalten:

postgres=# select ts_rank(to_tsvector('spanish', 'famoso sofas camas'),to_tsquery('spanish','famoso & cama')); 
    ts_rank 
----------- 
0.0985009 
(1 row) 

postgres=# select ts_rank(to_tsvector('spanish', 'famoso camas'),to_tsquery('spanish','famoso & cama')); 
    ts_rank 
----------- 
0.0991032 
(1 row) 

postgres=# select ts_rank(to_tsvector('spanish', 'sofas camas camas'),to_tsquery('spanish','cama')); 
    ts_rank 
----------- 
0.0759909 
(1 row) 

Auch die Dokumentation sais:

Unterschiedliche Anwendungen könnten zusätzliche Informationen benötigen für das Ranking, zum Beispiel Dokument Änderungszeit. Die integrierten Ranking-Funktionen sind nur Beispiele. Sie können Ihre eigenen Ranking-Funktionen schreiben und/oder ihre Ergebnisse mit zusätzlichen Faktoren kombinieren, um Ihre spezifischen Anforderungen zu erfüllen.

Sie können PostgreSQL-Code von GitHub abrufen. Benötigte Funktion ist ts_rank_tt.

Verwandte Themen