your full enable ejemplos sql-server full-text-search sql-like fulltext-index

sql server - full - Búsqueda de texto completo vs LIKE



sql server 2017 contains (5)

Respuesta corta

No hay una forma eficiente de realizar búsquedas de infijo en SQL Server, ni usar LIKE en una columna indexada o con un índice de texto completo.

Respuesta larga

En el caso general, no hay un texto completo equivalente al operador LIKE. Si bien LIKE funciona en una cadena de caracteres y puede realizar coincidencias de comodín arbitrarias contra cualquier cosa dentro del objetivo, por su diseño, el texto completo opera solo con palabras o términos completos. (Esto es una ligera simplificación, pero servirá para el propósito de esta respuesta).

El texto completo de SQL Server admite un subconjunto de LIKE con el operador de término de prefijo. De los documentos ( http://msdn.microsoft.com/en-us/library/ms187787.aspx ):

SELECT Name FROM Production.Product WHERE CONTAINS(Name, '' "Chain*" '');

devolvería productos con el nombre de sierra de cadena, chainmail, etc. Funcionalmente, esto no le otorga nada más que el operador LIKE estándar ( LIKE ''Chain%'' ), y siempre que la columna esté indexada, el uso de LIKE para una búsqueda con prefijos debería ser aceptable actuación.

El operador LIKE le permite colocar el comodín en cualquier lugar, por ejemplo, LIKE ''%chain'' , y como mencionó, evita que se use un índice. Pero con texto completo, el asterisco solo puede aparecer al final de un término de consulta, por lo que esto no es de ninguna ayuda para usted.

Usando LIKE, es posible realizar búsquedas eficientes de postfix creando una nueva columna, configurando su valor para que invierta su columna de destino e indexándola. A continuación, puede consultar de la siguiente manera:

SELECT Name FROM Production.Product WHERE Name_Reversed LIKE ''niahc%''; /* "chain" backwards */

que devuelve productos con sus nombres que terminan con "cadena".

Supongo que podría combinar el prefijo y el hack de postfix invertido:

SELECT Name FROM Production.Product WHERE Name LIKE ''chain%'' AND Name_Reversed LIKE ''niahc%'';

que implementa una búsqueda de infijo indexada (potencialmente), pero no es particularmente bonita (y nunca he probado esto para ver si el optimizador de consultas usaría ambos índices en su plan).

Mi pregunta es sobre el uso de texto completo. Como conozco, las consultas que comienzan con% nunca usan índice:

SELECT * from customer where name like %username%

Si uso texto completo para esta consulta, ¿puedo tener un mejor rendimiento? ¿Puede SQL Server usar ventajas de índice de texto completo para consultas como% username%?


, tiene toda la razón, ya que sugiere que no es suficiente buscar algo '' cadena '' DONDE Nombre LIKE ''cadena'' Y Name_Reversed LIKE ''niahc%'' no es equivalente a como ''% chain%'' ****


De lo que sé sobre los índices de texto completo, haré las siguientes extrapolaciones:

  1. Al indexar, analiza el texto, busca palabras (algunos RDBMS, como MySQL, solo consideran palabras de más de 3 caracteres) y colocan las palabras en el índice.
  2. Cuando busca en el índice de texto completo, busca palabras que luego se vinculan a la fila.
  3. Si tengo razón sobre los dos primeros (para MSSQL), solo funcionará si buscas PALABRAS, con longitudes de 4 o más caracteres. No buscará ''sillón'' si busca ''silla''.

Suponiendo que todo eso sea correcto, seguiré adelante y realizaré la siguiente declaración: El índice de texto completo es de hecho un índice, lo que hace que la búsqueda sea más rápida. Es grande y tiene menos posibilidades de búsqueda que LIKE, pero es mucho más rápido.

Más información:
developer.com/db/article.php/3446891
http://en.wikipedia.org/wiki/Full_text_search


Me gusta y contiene son muy diferentes -

Tome los siguientes valores de datos

''john smith'' ''sam smith'' ''john fuller''

como ''%'' ''sam smith''

como ''% s%'' ''john smith'' ''sam smith''

contiene ''s''

contiene ''john'' ''john smith'' ''john fuller''

contiene ''s *'' ''john smith'' ''sam smith''

contiene s devuelve lo mismo que contiene s *: el asterisco inicial se ignora, lo cual es un poco molesto, pero el índice es de palabras, no de caracteres


Tienes que entender cómo funciona el índice. El índice es muy parecido a la edición en madera muerta de la enciclopedia.

Si utiliza:

SELECT * from customer where name like username%

El índice, en texto completo o no texto completo debería funcionar. pero

SELECT * from customer where name like %username%

Nunca trabajará con el índice. y será una consulta que requiere mucho tiempo.