Búsqueda de text completo SQL vs "LIKE"

Digamos que tengo una aplicación bastante simple que permite a los usuarios almacenar información en DVD que poseen (título, actores, año, descripción, etc.) y quiero permitirles a los usuarios search en su colección por cualquiera de estos campos (por ejemplo, "Keanu Reeves"). o "The Matrix" serían consultas de búsqueda válidas).

¿Cuál es la ventaja de ir con la búsqueda de text completo de SQL frente a simplemente dividir la consulta por espacios y hacer unas pocas cláusulas "ME GUSTA" en la statement de SQL? ¿Funciona mejor o devolverá resultados más precisos?

Es probable que la búsqueda de text sea más rápida, ya que se beneficiará de un índice de palabras que usará para search los loggings, mientras que el uso de LIKE requerirá una exploración completa de la tabla.

En algunos casos LIKE será más preciso ya que LIKE "% The%" Y LIKE "% Matrix" seleccionará "The Matrix" pero no "Matrix Reloaded", mientras que la búsqueda de text completo ignorará "The" y devolverá ambos. Dicho eso, ambos habrían sido un mejor resultado.

Los índices de text completo (que son índices) son mucho más rápidos que el uso de LIKE (que esencialmente examina cada fila cada vez). Sin embargo, si sabe que la database será pequeña, es posible que no sea necesario utilizar índices de text completo. La única forma de determinar esto es con un promedio inteligente y algunas testings basadas en esa información.

La precisión es una pregunta diferente. La indexing de text completo le permite hacer varias cosas (ponderación, correspondencia automática de comer / comer / comer, etc.) que posiblemente no podría implementar en ningún tipo de marco de time razonable utilizando LIKE. La verdadera pregunta es si necesita esas características.

Sin leer la descripción de la documentation de text completo de estas características, realmente no sabrá cómo proceder. Entonces, ¡lee!

Además, algunas testings básicas (inserte un montón de filas en una tabla, tal vez con algún tipo de dictionary público como fuente de palabras) le ayudarán mucho a decidir.

Una consulta de búsqueda de text completo es mucho más rápida. Especialmente cuando se trabaja con muchos datos en varias columnas.

Además, tendrá soporte de búsqueda específico para el idioma. Por ejemplo, las diéresis alemanas como "ü" en "über" también se encontrarán cuando se almacenen como "ueber". También puede usar sinónimos donde puede expandir automáticamente las consultas de búsqueda, o replace o sustituir frases específicas.

En algunos casos LIKE será más preciso ya que LIKE "% The%" Y LIKE "% Matrix" seleccionará "The Matrix" pero no "Matrix Reloaded", mientras que la búsqueda de text completo ignorará "The" y devolverá ambos. Dicho eso, ambos habrían sido un mejor resultado.

Eso no es correcto. La syntax de búsqueda de text completo le permite especificar "cómo" desea search. Por ejemplo, al usar la instrucción CONTAINS puede usar la coincidencia exacta de términos así como la coincidencia difusa, los pesos, etc.

Entonces, si tiene problemas de performance o desea proporcionar una experiencia de búsqueda más "similar a Google", busque el motor de búsqueda de text completo. También es muy fácil de configurar.

Solo unas pocas notas:

  1. LIKE puede usar una búsqueda de índice si no inicia su LIKE con%. Ejemplo: LIKE 'Santa M%' es bueno! COMO '% Maria' es malo! y puede causar una exploración de tabla o índice porque no se puede indexar de la manera estándar.

  2. Esto es muy importante. Las actualizaciones de los Índices de text completo son asincrónicas. Por ejemplo, si realiza un INSERTO en una tabla seguido de un SELECCIONAR con Búsqueda de text completo donde espera que aparezcan los nuevos datos, es posible que no obtenga los datos inmediatamente. Según su configuration, es posible que deba esperar unos segundos o un día. En general, los Índices de text completo se completan cuando su sistema no tiene muchas requestes.

Funcionará mejor, pero a less que tenga muchos datos, no notará esa diferencia. Un índice de búsqueda de text completo de SQL le permite usar operadores que son más avanzados que una simple operación "ME GUSTA", pero si todo lo que hace es el equivalente de una operación LIKE contra su índice de text completo, sus resultados serán los mismos.

Imagina si permites ingresar notas / descripciones en DVD. En este caso, será bueno permitir search por descripciones. La búsqueda de text completo en este caso hará un mejor trabajo.

Puede get resultados ligeramente mejores, o al less tener una implementación más fácil con indexing de text completo. Pero depende de cómo quieras que funcione …

Lo que tengo en mente es que si está buscando dos palabras, con LIKE tiene que implementar manualmente (por ejemplo) un método para ponderar aquellos con los más altos en la list. Un índice de text completo debe hacer esto por usted, y le permitirá influir en las ponderaciones también usando la syntax relevante.

Para FullTextSearch en SQL Server como LIKE
Primero, debe crear una list de StopList y asignarla a su table

 CREATE FULLTEXT STOPLIST [MyStopList]; GO ALTER FULLTEXT INDEX ON dbo.[MyTableName] SET STOPLIST [MyStopList] GO 

En segundo lugar, use el siguiente script tSql:

 SELECT * FROM dbo.[MyTableName] AS mt WHERE CONTAINS((mt.ColumnName1,mt.ColumnName2,mt.ColumnName3), N'"*search text s*"') 

Si no solo busca palabras en inglés, digamos que busca una palabra en chino, entonces la forma en que su fts tokeniza las palabras hará que su búsqueda sea muy diferente, como he dado un ejemplo aquí https://stackoverflow.com/a/31396975/301513 . Pero no sé cómo SQL server tokenizes palabras en chino, ¿hace un buen trabajo para eso?