Eu gostaria de obter resultados por consulta isso:
SELECT *
FROM (
SELECT id, subject
FROM mailboxes
WHERE tsv @@ plainto_tsquery('avail')
) AS t1
ORDER BY id DESC;
Isso funciona e retorna linhas tsv
contendo 'Available' . Mas se eu usar 'avai' (truncando '...lable') ele não encontra nada.
Todas as consultas precisam estar no dicionário? Não podemos simplesmente consultar essas cartas? Tenho uma tabela que contém corpos de e-mail (conteúdo) e gostaria de fazer consultas rápidas pois ela cresce rapidamente. Atualmente, estou usando:
... WHERE content ~* 'avail'
Não. Porque apenas os radicais das palavras (de acordo com a configuração de pesquisa de texto usada ) estão no índice para começar. Mas mais importante:
Não . Porque, além disso, a pesquisa de texto completo também é capaz de correspondência de prefixo :
Isso funcionaria:
Observe 3 coisas:
Use
to_tsquery()
, notplainto_tsquery()
, neste caso porque ( citando o manual ):Use a
'simple'
configuração de pesquisa de texto para gerar otsquery
desde que você obviamente queira usar a palavra 'avail' como está e não aplicar a derivação.Acrescente
:*
para torná-lo uma pesquisa de prefixo, ou seja, encontre todos os lexemas começando com 'avail'.Importante: Esta é uma pesquisa de prefixo em lexemas (raízes de palavras) no documento. Uma correspondência de expressão regular sem curingas (
content ~* 'avail'
) não é exatamente a mesma! O último não é ancorado à esquerda (no início dos lexemas) e também encontraria 'FOOavail' etc.Não está claro se você deseja o comportamento descrito em sua consulta ou o equivalente à expressão regular adicionada. Índices de trigramas usando o módulo adicional (
pg_trgm
) são a ferramenta certa para isso. Existem muitas questões relacionadas em dba.SE, tente uma pesquisa .Visão geral:
Demonstração
Resposta relacionada (capítulo "Abordagem diferente para otimizar a pesquisa" ):
E-mails?
Como você mencionou e-mails, esteja ciente de que o analisador de pesquisa de texto identifica e-mails e não os divide em palavras / lexemas separados. Considerar:
Eu substituiria os separadores
@
e.
em seus e-mails por espaço (' '
) para indexar as palavras contidas.Além disso, como você está lidando com nomes em e-mails, não com palavras em inglês (ou algum outro idioma) , eu usaria a
'simple'
configuração de pesquisa de texto para desabilitar o tema e outros recursos de idioma :Construa a
ts_vector
coluna com: