No se puede usar un predicado CONTAINS o FREETEXT en una tabla o vista indexada porque no tiene un índice de texto completo

98

Recibo el siguiente error en mi base de datos SQL Server 2008 R2:

No se puede usar un predicado CONTAINSo FREETEXTen la tabla o vista indexada 'tblArmy' porque no tiene un índice de texto completo.

DotnetGorrión
fuente
1
¿Ha creado realmente un catálogo de texto completo?
Alex K.

Respuestas:

113
  1. Asegúrese de tener instalada la función de búsqueda de texto completo.

    Configuración de búsqueda de texto completo

  2. Cree un catálogo de búsqueda de texto completo.

     use AdventureWorks
     create fulltext catalog FullTextCatalog as default
    
     select *
     from sys.fulltext_catalogs
    
  3. Cree un índice de búsqueda de texto completo.

     create fulltext index on Production.ProductDescription(Description)
     key index PK_ProductDescription_ProductDescriptionID
    

    Antes de crear el índice, asegúrese de que:
    - no tenga un índice de búsqueda de texto completo en la tabla, ya que solo se permite un índice de búsqueda de texto completo en una tabla
    - existe un índice único en la tabla. El índice debe basarse en una columna de clave única, que no permite NULL.
    - Existe un catálogo de texto completo. Debe especificar el nombre del catálogo de texto completo de forma explícita si no hay un catálogo de texto completo predeterminado.

Puede realizar los pasos 2 y 3 en SQL Sever Management Studio. En el explorador de objetos, haga clic derecho en una tabla, seleccione el Full-Text indexelemento del menú y luego el Define Full-Text Index...elemento del submenú. El asistente de indexación de texto completo lo guiará a través del proceso. También creará un catálogo de búsqueda de texto completo para usted si aún no tiene ninguno.

ingrese la descripción de la imagen aquí

Puede encontrar más información en MSDN

Alex Aza
fuente
¡Buena información Alex! NOTA: para aquellos que usan Azure SQL, no es compatible con la tabla Contiene en este momento. Ver aquí: msdn.microsoft.com/library/azure/ee336253.aspx
Termato
Además, si usa SQL Express Advanced Services, consulte aquí para crear un índice de texto completo: stackoverflow.com/questions/10407337/…
Termato
71

Una solución alternativa para CONTAINS: Si no desea crear un índice de texto completo en la columna y el rendimiento no es una de sus prioridades, puede usar la LIKEdeclaración que no necesita ninguna configuración previa:

Ejemplo: busque todos los Productos que contengan la letra Q:

SELECT ID, ProductName
FROM [ProductsDB].[dbo].[Products]
WHERE [ProductsDB].[dbo].[Products].ProductName LIKE '%Q%'
Mohammad Sepahvand
fuente
1
enlace . El predicado LIKE Transact-SQL solo funciona en patrones de caracteres. Además, no puede utilizar el predicado LIKE para consultar datos binarios formateados. Además, una consulta LIKE contra una gran cantidad de datos de texto no estructurados es mucho más lenta que una consulta equivalente de texto completo contra los mismos datos.
Manolis
3
Ah, dulce ... la forma fácil y sencilla que no requiere que desenterrar su instalador y jugar con la configuración de su entorno. ¡Bien hecho!
Christine
21

Debe definir Full-Text-Indexen todas las tablas de la base de datos dónde necesita usar una consulta con la CONTAINSque tomará algún tiempo.

En su lugar, puede usar el LIKEque le dará resultados instantáneos sin la necesidad de ajustar ninguna configuración para las tablas.

Ejemplo:

SELECT * FROM ChartOfAccounts WHERE AccountName LIKE '%Tax%'

El mismo resultado obtenido con CONTAINSse puede obtener con LIKE.

ver el resultado: ingrese la descripción de la imagen aquí

Ashraf Abusada
fuente
Eso es realmente inteligente
WonderWorker
6
Este es un buen truco, pero la forma en que está redactada esta respuesta es incorrecta. No lo "use". Hay algunas implicaciones de rendimiento serias para hacer esto y cualquiera que lo ponga en un sistema de producción debería pensar con mucho cuidado en hacer escaneos completos de tablas como este en una columna no indexada.
Caesay
3

Es posible que deba habilitar la tabla para la indexación de texto completo .

mellamokb
fuente
habilitar / deshabilitar la búsqueda de texto completo está atenuada en el menú contextual. Supongo que necesito instalar la búsqueda de texto completo. ¿Cómo puedo instalar la búsqueda de texto completo?
DotnetSparrow
Ejecute la instalación de SQL Server y debería haber una opción para cambiar los componentes instalados (o algo similar). Haga clic en eso y luego marque la casilla de verificación Texto completo en el momento apropiado y debería estar bien. Lo siento, no tengo uno a mano o daría instrucciones más específicas.
Tom H
@Hola Tom: No vi la opción para agregar funciones cuando ejecuto el instalador de SQL Server 2008 R2.
DotnetSparrow
1

debe agregar un índice de texto completo en los campos específicos que desea buscar.

ALTER TABLE news ADD FULLTEXT(headline, story);

donde "noticias" es su tabla y los campos "título, historia" que no habilitará para la búsqueda de texto completo

SimonQuest
fuente
1

Hay una solución más para establecer el texto completo de la columna en verdadero.

Esta solución, por ejemplo, no funcionó para mí.

ALTER TABLE news ADD FULLTEXT(headline, story);

Mi solución.

  1. Haga clic derecho en la mesa
  2. Diseño
  3. Haga clic derecho en la columna que desea editar
  4. Índice de texto completo
  5. Añadir
  6. Cerrar
  7. Actualizar

PRÓXIMOS PASOS

  1. Haga clic derecho en la mesa
  2. Diseño
  3. Haga clic en la columna que desea editar
  4. En la parte inferior de mssql, habrá una pestaña "Propiedades de columna"
  5. Especificación de texto completo -> (Se indexa el texto completo) establecido en verdadero.

Actualizar

Versión de mssql 2014

Hielo T
fuente
-1
Select * from table
where CONTAINS([Column], '"A00*"')  

actuará como% igual que

where [Column] Like 'A00%'
Dnyanesh Mijagiri
fuente