¿Cómo se obtienen las principales búsquedas de texto completo de comodines para que funcionen en SQL Server?

Nota: Estoy utilizando capacidades de búsqueda de texto completo de SQL, cláusulas CONTAINS y todo: el * es el comodín en texto completo,% es solo para cláusulas MEJORAS.

He leído en varios lugares ahora que las búsquedas de “comodín líder” (por ejemplo, usar “* overflow” para que coincida con “stackoverflow”) no son compatibles con MS SQL. Estoy considerando usar una función CLR para agregar correspondencia con expresiones regulares , pero tengo curiosidad por ver qué otras soluciones podrían tener las personas.

Más información : puede agregar el asterisco solo al final de la palabra o frase. – junto con mi experiencia empírica: cuando se combina “myvalue”, “my *” funciona, pero “valor (asterisco)” no devuelve coincidencias, al hacer una consulta tan simple como:

SELECT * FROM TABLENAME WHERE CONTAINS(TextColumn, '"*searchterm"'); 

Por lo tanto, mi necesidad de una solución alternativa. Solo estoy usando la búsqueda en mi sitio en una página de búsqueda real, por lo que debe funcionar básicamente de la misma manera que funciona Google (a los ojos de un usuario tipo Joe Sixpack). No es tan complicado, pero este tipo de partido no debería fallar.

Solución alternativa solo para el comodín principal:

  • almacenar el texto invertido en un campo diferente (o en la vista materializada)
  • crear un índice de texto completo en esta columna
  • encuentra el texto invertido con un *

     SELECT * FROM TABLENAME WHERE CONTAINS(TextColumnREV, '"mrethcraes*"'); 

Por supuesto, hay muchos inconvenientes, solo para una solución rápida …

Por no mencionar CONTAINSTABLE …

El problema con los comodines líderes: no se pueden indexar, por lo tanto, se está haciendo un escaneo completo de la tabla.

Una cosa que vale la pena tener en cuenta es que las consultas de comodines líderes tienen un rendimiento premium significativo, en comparación con otros usos de comodines.

Es posible usar el comodín “*” al final de la palabra o frase (búsqueda de prefijo).

Por ejemplo, esta consulta encontrará todos los “datab”, “base de datos”, “bases de datos” …

 SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"datab*"') 

Pero, desafortunadamente, no es posible buscar con el comodín principal.

Por ejemplo, esta consulta no encontrará “base de datos”

 SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"') 

Para agregar claridad a este hilo, de mi prueba en 2008 R2, Franjo está correcto arriba. Cuando se trata de la búsqueda de texto completo, al menos cuando se utiliza la frase CONTAINS, no se puede usar un encabezado , solo un final funcionalmente. * es el comodín, no% en texto completo.

Algunos han sugerido que * se ignora. Ese no parece ser el caso, mis resultados parecen mostrar que la funcionalidad final * funciona. Creo que los principales * son ignorados por el motor.

Sin embargo, mi problema añadido es que la misma consulta, con un * final, que usa texto completo con comodines, funcionó de manera relativamente rápida en 2005 (20 segundos), y disminuyó a 12 minutos después de migrar el db al 2008 R2. Parece que al menos otro usuario tuvo resultados similares y comenzó una publicación en el foro que agregué a … FREETEXT funciona todavía de manera rápida, pero algo “parece” haber cambiado con la forma en que los procesos 2008 siguen * en CONTIENE. Dan todo tipo de advertencias en el Asesor de actualizaciones de que “mejoraron” el TEXTO COMPLETO para que tu código se rompa, pero desafortunadamente no te dan advertencias específicas sobre ciertos códigos en desuso, etc. … solo un descargo de responsabilidad que lo cambiaron, Úselo bajo su propio riesgo.

http://social.msdn.microsoft.com/Forums/ar-SA/sqlsearch/thread/7e45b7e4-2061-4c89-af68-febd668f346c

Tal vez, este es el golpe de MS más cercano relacionado con estos problemas … http://msdn.microsoft.com/en-us/library/ms143709.aspx

El carácter comodín en SQL Server es el signo % y funciona bien, al principio, al final o de lo contrario.

Dicho esto, si va a realizar algún tipo de búsqueda seria de texto completo, entonces consideraría utilizar las capacidades del Índice de texto completo. Usar % y _ comodines hará que tu base de datos tenga un impacto de rendimiento serio.

De los libros en línea de SQL Server:

Para escribir consultas de texto completo en Microsoft SQL Server 2005, debe aprender a usar los predicados CONTAINS y FREETEXT Transact-SQL y las funciones CONTAINSTABLE y FREETEXTTABLE con valores de conjunto de filas.

Eso significa que todas las consultas escritas arriba con% y _ no son consultas válidas de texto completo.

Aquí hay una muestra de cómo se ve una consulta cuando se llama a la función CONTAINSTABLE.

SELECCIONAR RANGO, * FROM TableName, CONTAINSTABLE (TableName, *, ‘”* WildCard”‘) searchTable WHERE [KEY] = TableName.pk ORDER BY searchTable.RANK DESC

Para que la función CONTAINSTABLE sepa que estoy usando una búsqueda comodín, debo envolverla entre comillas dobles. Puedo usar el carácter comodín * al principio o al final. Hay muchas otras cosas que puede hacer cuando construye la cadena de búsqueda para la función CONTAINSTABLE. Puede buscar una palabra cerca de otra palabra, buscar palabras de inflexión (conducir = conducir, conducir, conducir) y buscar sinónimo de otra palabra (el metal puede tener sinónimos como el aluminio y el acero).

Acabo de crear una tabla, poner un índice de texto completo sobre la mesa e hice un par de búsquedas de prueba y no tuve ningún problema, por lo que la búsqueda de comodines funciona según lo previsto.

[Actualizar]

Veo que ha actualizado su pregunta y sabe que necesita usar una de las funciones.

Todavía puede buscar con el comodín al principio, pero si la palabra no es una palabra completa siguiendo el comodín, debe agregar otro comodín al final.

 Example: "*ildcar" will look for a single word as long as it ends with "ildcar". Example: "*ildcar*" will look for a single word with "ildcar" in the middle, which means it will match "wildcard". [Just noticed that Markdown removed the wildcard characters from the beginning and ending of my quoted string here.] 

[Actualización n. ° 2]

Dave Ward: Usar un comodín con una de las funciones no debería ser un gran golpe. Si creé una cadena de búsqueda con solo “*”, no devolverá todas las filas, en mi caso de prueba, devolvió 0 registros.

Solo para tu información, Google no realiza ninguna búsqueda o truncamiento de subcadenas, derecha o izquierda. Tienen un carácter comodín * para encontrar palabras desconocidas en una frase, pero no una palabra.

Google, junto con la mayoría de los motores de búsqueda de texto completo, establece un índice invertido basado en el orden alfabético de las palabras, con enlaces a sus documentos de origen. La búsqueda binaria es muy rápida, incluso para índices enormes. Pero es realmente muy difícil hacer un truncamiento de la izquierda en este caso, porque pierde la ventaja del índice.

Como parámetro en un procedimiento almacenado, puede usarlo como:

 ALTER procedure [dbo].[uspLkp_DrugProductSelectAllByName] ( @PROPRIETARY_NAME varchar(10) ) as set nocount on declare @PROPRIETARY_NAME2 varchar(10) = '"' + @PROPRIETARY_NAME + '*"' select ldp.*, lkp.DRUG_PKG_ID from Lkp_DrugProduct ldp left outer join Lkp_DrugPackage lkp on ldp.DRUG_PROD_ID = lkp.DRUG_PROD_ID where contains(ldp.PROPRIETARY_NAME, @PROPRIETARY_NAME2) 

% Coincide con cualquier cantidad de caracteres _ Coincide con un solo carácter

Nunca utilicé la indexación de texto completo, pero puede realizar consultas de búsqueda bastante complejas y rápidas simplemente usando la comstackción en las funciones de cadena de T-SQL.

En lo que respecta a la búsqueda de texto completo, para mi dinero nada supera a Lucene . Hay un puerto .Net disponible que es compatible con índices creados con la versión de Java.

Hay un poco de trabajo involucrado en que tienes que crear / mantener los índices, pero la velocidad de búsqueda es fantástica y puedes crear todo tipo de consultas interesantes. Incluso la velocidad de indexación es bastante buena: reconstruimos completamente nuestros índices una vez al día y no nos preocupamos por actualizarlos.

Como un ejemplo, esta funcionalidad de búsqueda es alimentada por Lucene.Net.

Quizás el siguiente enlace proporcione la respuesta final a este uso de comodines: realizar búsquedas de comodines FTS .

Observe el pasaje que dice: “Sin embargo, si especifica” Cadena “oCadena “ , no obtendrá el resultado esperado. El asterisco será considerado como un signo de puntuación normal, no como un carácter comodín”.

Si tiene acceso a la lista de palabras del motor de búsqueda de texto completo, puede hacer una búsqueda “me gusta” en esta lista y hacer coincidir la base de datos con las palabras encontradas, por ejemplo, una tabla de “palabras” con las siguientes palabras:

  pie applepie spies cherrypie dog cat 

Para hacer coincidir todas las palabras que contienen ‘pie’ en esta base de datos en una tabla fts ‘full_text’ con el campo ‘texto’:

  to-match <- SELECT word FROM words WHERE word LIKE '%pie%' matcher = "" a = "" foreach(m, to-match) { matcher += a matcher += m a = " OR " } SELECT text FROM full_text WHERE text MATCH matcher 

Usando el carácter ‘%’ he buscado en nuestra base de datos utilizando algo como lo siguiente:

 SELECT name FROM TblNames WHERE name LIKE '%overflow' 

El uso de este formulario o consulta puede ser lento a veces, pero solo lo utilizamos para la búsqueda manual ocasional.