PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

O operador de pesquisa de frase <-> funciona com documentos JSONB ou apenas tabelas relacionais?


O recurso de pesquisa de frase está integrado aos dados de pesquisa de texto tipo tsquery . O operador de pesquisa de texto @@ você exibe leva um tsvector à esquerda e um tsquery Para a direita. E um tsvector pode ser construído a partir de qualquer tipo de caractere, bem como de um documento JSON.

Relacionado:

Você pode converter seu json ou jsonb documento para um vetor de pesquisa de texto com um dos dedicados funções :
to_tsvector()
json(b)_to_tsvector()

Observe que eles incluem apenas valores do documento JSON, não chaves . Normalmente, é isso que você quer. Exemplo básico:
SELECT to_tsvector(jsonb '{"foo":"jump quickly"}')
    @@ to_tsquery('jump <-> quick:*');

Demonstrando a correspondência de prefixo em cima da pesquisa de frase enquanto estiver nisso. Ver:

Alternativamente , você pode simplesmente criar o tsvector do text representação do seu documento JSON para incluir também nomes de chave:
SELECT to_tsvector((jsonb '{"foo-fighter":"jump quickly"}')::text)
    @@ to_tsquery('foo <-> fight:*');

Produz um tsvector maior , obviamente.

Ambos podem ser indexados (que é o ponto principal da pesquisa de texto). Apenas índices são vinculados a tabelas relacionais. (E você pode indexar a expressão !)
A expressão em si pode ser aplicada a qualquer valor, não vinculada a tabelas como você parece sugerir.