2009-01-25 22 views
29

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 permitir a los usuarios buscar en su colección por cualquiera de estos campos (por ejemplo, "Keanu Reeves" o "The Matrix" serían consultas de búsqueda válidas).Búsqueda de texto SQL vs "LIKE"

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

Respuesta

27

La búsqueda de texto completo es más rápida, ya que se beneficiará de un índice de palabras que usará para buscar los registros, mientras que con LIKE se necesitará una exploración completa de la tabla.

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

+0

¿No podemos crear un índice para el carácter [patrones] (https://www.postgresql.org/docs/9.5/static/indexes-opclass.html)? – overexchange

3

Funcionará mejor, pero a menos que tenga muchos datos, no notará esa diferencia. Un índice de búsqueda de texto 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 texto completo, sus resultados serán los mismos.

0

Imagine si permite ingresar notas/descripciones en DVD. En este caso, será bueno permitir buscar por descripciones. La búsqueda de texto completo en este caso hará un mejor trabajo.

9

Los índices de texto 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 base de datos será pequeña, es posible que no sea necesario utilizar índices de texto completo. La única forma de determinar esto es con un promedio inteligente y algunas pruebas basadas en esa información.

La precisión es una pregunta diferente. La indexación de texto 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 tiempo razonable utilizando LIKE. La verdadera pregunta es si necesita esas características.

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

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

0

Puede obtener resultados ligeramente mejores, o al menos tener una implementación más fácil con la indexación de texto completo. Pero depende de cómo quiera 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 ponderarlas con ambos más arriba en la lista. Un índice de texto completo debe hacer esto por usted, y le permitirá influir en las ponderaciones también usando la sintaxis relevante.

7

Una consulta de búsqueda de texto 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. P.ej. 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 reemplazar o sustituir frases específicas.

En algunos casos como será más preciso ya que como "% El%" Y COMO "Matrix%" escogerá "The Matrix", pero no "Matrix Reloaded", mientras que el texto completo búsqueda ignorará " El "y devolver ambos. Dicho esto, ambos habrían tenido mejor resultado.

Eso no es correcto. La sintaxis de búsqueda de texto completo le permite especificar "cómo" desea buscar. P.ej. mediante el uso de la declaración CONTAINS puede usar la coincidencia de términos exactos así como la concordancia difusa, los pesos, etc.

Así que si tiene problemas de rendimiento o desea proporcionar una experiencia de búsqueda más "similar a Google", busque la búsqueda de texto completo motor. También es muy fácil de configurar.

6

Sólo unas pocas notas:

  1. similares pueden utilizar un índice Seek si no comienza 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 texto completo son asincrónicas. Por ejemplo, si realiza un INSERTO en una tabla seguido de un SELECCIONAR con Búsqueda de texto completo donde espera que aparezcan los nuevos datos, es posible que no obtenga los datos inmediatamente. Según su configuración, es posible que deba esperar unos segundos o un día. En general, los Índices de texto completo se completan cuando su sistema no tiene muchas solicitudes.

0

Para FullTextSearch en SQL Server como LIKE
En primer lugar, usted tiene que crear un StopList y asignarlo a su mesa

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

En segundo lugar, utilizar la siguiente secuencia de comandos TSQL:

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

Si no solo busca palabras en inglés, digamos que busca una palabra china, entonces, cómo sus palabras tokens significa haz que tu búsqueda sea muy diferente, como di 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?

Cuestiones relacionadas