2016-11-01 3 views
0

Je dois effectuer un filtrage de correspondance flou (dans la clause WHERE) dans PostgreSQL en utilisant l'opérateur de similarité trigramme%. Pour comparer une paire de champs, il suffit de table1.field1 % table2.field2 et les index GIN ou GIST peuvent être utilisés pour augmenter considérablement les performances. Cependant, j'ai besoin de comparer des tas de champs à la fois et la conclusion finale devrait être basée sur la similitude globale. Pour que je puisse utiliser l'expression concaténée comme ce qui suit:Comparaison de similarité de plusieurs colonnes avec l'opérateur de similarité trigramme%

(COALESCE (l.field1, ' ') 
|| ' ' || COALESCE (l.field2,' ') 
|| ' ' || COALESCE (l.field3,' ') 
|| ' ' || COALESCE (l.field4,' ') 
) % (COALESCE (r.field1, ' ') 
|| ' ' || COALESCE (r.field2,' ') 
|| ' ' || COALESCE (r.field3,' ') 
|| ' ' || COALESCE (r.field4,' ')) 

Cette expression, ne peut toutefois pas utiliser les index GIN ou GIST sur les champs individuels et la performance est médiocre. Bien sûr, une solution évidente consiste à créer un nouveau champ concaténé dans les deux tables, à créer des index GIN sur ceux-ci, puis à comparer les champs concaténés.

l.concatenated_field % r.concatenated_field 

Dans ce cas, les index GIN ou GIST sont utilisés. Mais, pour diverses raisons, je ne suis pas satisfait de cette solution et je me demandais s'il existe une alternative pour comparer les similarités multicolonnes avec l'opérateur trigramme (%), où les champs individuels GIN ou GIST seraient utilisés?

+0

L'index d'expression GIN peut-il être créé sur de telles expressions de chaîne de concaténation? – zlatko

Répondre