La respuesta de sp_BlitzErik tiene muchos puntos buenos, pero no creo que sea por eso que no deberías usar la búsqueda de texto completo. La búsqueda de texto completo no está ahí para hacer lo que crees que hace. No está allí para buscar múltiples campos. Está allí para vectorizar el contenido de las palabras y hacer uso de diccionarios, trozos, lexers, diccionarios geográficos, eliminación de palabras vacías y una serie de otros trucos, ninguno de los cuales se aplica. O, aún no se ha demostrado que se apliquen.
Tampoco estoy de acuerdo con la solución, aunque no estoy seguro de cómo hacerlo mejor en SQL Server. Recreemos sus datos para PostgreSQL: también es mucho más limpio crear en PostgreSQL.
CREATE TABLE fulltextindexesarestupid
AS
SELECT
id,
CASE WHEN Id % 15 = 0 THEN 'Bad'
WHEN Id % 3 = 0 THEN 'Idea'
WHEN Id % 5 = 0 THEN 'Jeans'
END AS StopAbusingFeatures
FROM generate_series(1,1000000) AS id;
Ahora lo que quieres es un tipo de enumeración,
CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');
ALTER TABLE fulltextindexesarestupid
ALTER StopAbusingFeatures
SET DATA TYPE foo
USING StopAbusingFeatures::foo;
Ahora ha colapsado las cadenas a representaciones enteras. Pero aún mejor puedes consultarlos como antes.
SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';
Esto tiene el efecto.
- oculta el hecho de que sus categorías son un tipo enumerado. Esa complejidad está encapsulada en el tipo y oculta al usuario.
- También coloca el mantenimiento en esas categorías en el tipo.
- Está estandarizado.
- no aumenta el tamaño de la fila.
Sin estos beneficios, básicamente solo estás tratando de optimizar la comparación de cadenas. Pero, por desgracia, ni siquiera estoy seguro de cómo sp_BlitzErik llega a la respuesta dado el código en la sugerencia,
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
Puede colapsar los tokens a números enteros usando una enumeración, o el método de desplazamiento manual sugerido por sp_BlitzErik, pero si puede hacer el colapso, ¿por qué hace lo mismo sin anclar? Es decir, si sabes que '% pasta%' es el token 'pasta', ¿por qué tienes los %
dos lados? Sin '%', esta es una verificación de igualdad y debería ser bastante rápida incluso como texto.