Nuestro grupo especializado despúes de algunos días de investigación y de recopilar de datos, hallamos la solución, nuestro deseo es que todo este artículo sea de gran utilidad en tu proyecto.
Solución:
Además de lo que ya explicó @swasheck, probablemente obtendrá un mejor rendimiento con LIKE
(~~
) y ILIKE
(~~*
) en combinación con un trigrama GiST o índice GIN. Tendrás que instalar el módulo adicional pg_trgm para eso. Encuentre detalles en estas preguntas relacionadas:
- ¿Cómo se implementa LIKE?
- Coincidencia de patrones con LIKE, SIMILAR TO o expresiones regulares en PostgreSQL
Los índices de trigramas se pueden utilizar para básico coincidencias de expresiones regulares (~
) también, pero LIKE
es generalmente más rápido.
Crea un índice como:
CREATE INDEX stickers_title_gin_trgm_idx ON stickers
USING gin (title gin_trgm_ops);
Entonces esto debería ser muy rápido:
SELECT *
FROM stickers
WHERE title ~~* '%case 580%';
O (no está claro en su pregunta):
SELECT *
FROM stickers
WHERE title ~~* '%case%'
AND title ~~ '%580%';
Este no es realmente un caso de uso para la búsqueda de texto completo porque el texto completo se basa en derivar el texto y analizar los fragmentos en tokens. Como puedes ver desde keywords
, ‘580h’ se analiza como su propia palabra porque no hay ningún idioma en el que ‘580’ sea una “raíz” de ‘580h’. Probablemente estaría mejor con la coincidencia de expresiones regulares.
Aquí hay una consulta que trabajé para usted:
SELECT id, title
FROM stickers WHERE
(title ~* '580')
AND
(title ~* 'case')
ORDER BY id
SELECT
*
FROM
stickers
WHERE
keywords @@ to_tsquery('case & 580:*')
trabajará.
La búsqueda de texto de Postgres permite prefix búsqueda, que está representada por :* en la consulta. Coincidirá con cualquier token que comience con 580
Si guardas alguna incertidumbre y disposición de progresar nuestro escrito eres capaz de añadir una acotación y con deseo lo interpretaremos.