Todas as consultas precisam estar no dicionário?
Não. Como apenas as hastes de 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:
SELECT id, subject
FROM mailboxes
WHERE tsv @@ to_tsquery('simple', 'avail:*')
ORDER BY id DESC;
Observe 3 coisas:
Use to_tsquery()
, não plainto_tsquery()
, neste caso, porque ( citando o manual ):
... plainto_tsquery
não reconhecerá tsquery
operadores, rótulos de peso ou rótulos de correspondência de prefixo em sua entrada
Use a 'simple'
configuração de pesquisa de texto para gerar o valor, tsquery
pois você obviamente deseja usar a palavra 'avail' como está e não aplicar o stemming.
Anexe :*
para torná-lo uma pesquisa de prefixo, ou seja, encontre todos os lexemas começando com 'avail'.
Importante: Esta é uma pesquisa de prefixo em lexemes (palavra derivada) no documento. Uma correspondência de expressão regular sem caracteres curinga ( content ~* 'avail'
) não é exatamente a mesma! O último não está 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 ( pg_trgm
) como @Evan já sugeridos são a ferramenta certa para isso. Existem muitas perguntas relacionadas no dba.SE, tente uma pesquisa .
Visão geral:
Demo
SELECT *
FROM (
VALUES
('Zend has no framework')
, ('Zend Framework')
) sub(t), to_tsvector(t) AS tsv
WHERE tsv @@ to_tsquery('zend <-> fram:*');
id | t | tsv
----+----------------+------------------------
2 | Zend Framework | 'framework':2 'zend':1
Resposta relacionada recente (capítulo Abordagem diferente para otimizar a pesquisa ):
Emails?
Como você mencionou e-mails, lembre-se de que o analisador de pesquisa de texto identifica e-mails e não os divide em palavras / lexemes separados. Considerar:
SELECT ts_debug('english', 'xangr@some.domain.com')
(email,"Email address",xangr@some.domain.com,{simple},simple,{xangr@some.domain.com})
Eu substituiria os separadores @
e .
nos seus emails por space ( ' '
) para indexar as palavras contidas.
Além disso, como você está lidando com nomes em emails, não com palavras em inglês (ou em outro idioma) , eu usaria a 'simple'
configuração de pesquisa de texto para desativar os recursos de stemming e outros idiomas :
Crie a ts_vector
coluna com:
SELECT to_tsvector('simple', translate('joe.xangr@some.domain.com', '@.', ' ')) AS tsv;
:*
documentado e 2) uma menção a construir não deve serto_tsvector('simple'..)
acompanhada de instruções que futuras consultas a esse tsv exigirão a configuração "simples" também para o tsquery? Eu acho que você deve esclarecer as implicações de desativar o stemming em um tsvector / tsquery.