2008-11-17 25 views
15

Estoy tratando de entender cómo buscar algo que aparezca en medio de una palabra/expresión, algo así como buscar "LIKE% book%" - pero en el catálogo de texto completo de SQL Server (2005).Catálogo de texto completo/búsqueda de índice% libro%

¿Cómo puedo hacer eso? Casi parece como si CONTAINS y FREETEXT realmente no admiten caracteres comodín en el comenzando de una expresión de búsqueda - ¿realmente puede ser?

Me hubiera imaginado que FREETEXT(*, "book") encontraría cualquier cosa con "libro" en el interior, incluyendo "rebooked" o algo así.

+0

Comprobar este enlace para una clase de ayuda que es muy útil para FTS en SQL Server 2005: [http://ewbi.blogs.com/develops/2007 /05/normalizing_sql.html](http://ewbi.blogs.com/develops/2007/05/normalizing_sql.html) –

Respuesta

3

Si quiere hacer una búsqueda seria de texto completo, entonces (y tengo) utilizar Lucene.Net. La búsqueda de texto completo de MS SQL nunca parece funcionar tan bien para nada más que lo básico.

14

lamentablemente contiene sólo admite comodines prefijo:

CONTAINS(*, '"book*"') 
+0

Sí, así es como he estado haciendo mis búsquedas "me gusta" con iFTS. Funciona muy bien –

7

SQL Server búsqueda de texto completo se basa en tokenizar texto en palabras. No hay una unidad más pequeña como palabra, por lo que las cosas más pequeñas que puede buscar son palabras.

Puede buscar prefix searches para buscar coincidencias que comiencen con ciertos caracteres, lo cual es posible porque las listas de palabras se mantienen en orden alfabético y todo lo que el servidor debe hacer es escanear la lista para buscar coincidencias.

Para hacer lo que quiera una consulta con una cláusula LIKE '%book%' probablemente sea igual de rápida (o lenta).

1

Aquí hay una sugerencia que es una solución para esa limitación de comodín. Usted crea una columna calculada que contiene el mismo contenido pero en reversa como la (s) columna (s) que está buscando.

Si, por ejemplo, está buscando en una columna llamada 'ProductTitle', cree una columna llamada ProductsRev. A continuación, actualice 'columna calculada Especificación' el valor de ese campo para ser:

(reverse ([ProductTitle]))

incluir la columna 'ProductsRev' en su búsqueda y ahora debería ser capaz de devolver resultados que soportan una comodín al comienzo de la palabra. ¡¡Buena suerte!!

+1

que no encontrará "rebbooked", ya que a la inversa es "dekoober" y "koob *" aún no coincide. – jerry

+0

Esto es creativo, pero como sugiere el otro comentario, solo ayuda con palabras que terminan en el objetivo, no en palabras que tienen el objetivo en el medio. Además, se siente como un olor a datos/código que creo que los implementadores están mejor usando el 'LIKE% blah%' regular o cambiando los motores DB. –

1

El texto completo tiene una tabla que enumera todas las palabras que el motor ha encontrado. Debe tener órdenes de magnitud menos filas que su tabla indexada de texto completo. Puede seleccionar de esa tabla "donde campo como '% book%'" para obtener todas las palabras que tienen 'libro' en ellos. Luego use esa lista para escribir una consulta de texto completo. Es engorroso, pero funcionaría, y estaría bien en el departamento de velocidad. SIN EMBARGO, al final estás usando el texto completo incorrecto cuando haces esto. En realidad, podría ser mejor educar la fuente de estas solicitudes de características sobre qué texto completo está haciendo. Desea que entiendan lo que QUIERE hacer, para que puedan obtener un gran valor del texto completo. Ejemplo, solo use comodines al final de una palabra, lo que significa que piensa en las palabras en una lista ordenada.

0

por qué no programar un conjunto en C# para calcular todos los sufijos no repetidos. Por ejemplo, si tiene el texto "comer la carne roja", puede almacenar en un campo "comer en la carne roja y editada" (tenga en cuenta que no es necesario agregar "comer" y "t" nuevamente) y luego en este campo usa búsqueda de texto completo. Una función para hacer eso puede escribirse fácilmente en Csharp

x) Sé que parece od ...es un workarround x) Sé que estoy agregando sobrecarga en la inserción/actualización .... solo se justifica si esta sobrecarga es insignificante además de la mejora en la función de búsqueda x) Sé que también hay una sobrecarga en el tamaño de los datos almacenados.

Pero estoy bastante conffident que será bastante rápido

Cuestiones relacionadas