2009-02-25 32 views
13

Tengo una tabla de Productos en una base de datos de SQL Server y tengo que solucionar un procedimiento almacenado heredado que usa indexación de texto completo. Para nuestros propósitos aquí, supongamos que la tabla Productos tiene dos campos ID, Palabras clave. Y el campo Palabras clave está poblada con lo siguiente:Problema de SQL: Usar CONTAINS() no funciona, pero LIKE funciona bien

ROLAND SA-300 Este Roland SA-300 es en perfecto estado!

Cuando ejecuto la siguiente declaración, que soy capaz de recuperar el registro:

SELECT * FROM Products WHERE Keywords LIKE '%SA-300%' 

Sin embargo, cuando corro cualquiera de las siguientes afirmaciones me sale cero resultados:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' SA-300 ') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA-300') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"SA-300"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*SA-300*"') 

Pero sé que la función CONTAINS() funciona porque obtengo resultados cuando ejecuto cualquiera de estos:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' Roland ') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"Roland"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*Roland*"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland') 

Necesito averiguar por qué la función CONTAINS() no funciona en el término 'SA-300'. Soy nuevo en los índices de texto completo, por lo que cualquier ayuda es apreciada.

+2

No hay idea, pero ¿has verificado que el índice es actual? – MichaelGG

Respuesta

13

dos pensamientos:

(1) El guión podría ser tratada como una ruptura palabra ¿Qué tienen estas retorno?

SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA 300') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA300') 

Ver esto other question.

(2) ¿Ha intentado reconstruir su índice de texto completo? Es posible que esté desactualizado.

+0

# 2 era correcto. Gracias – jessegavin

-1

Se puede tratar

SELECT * FROM Products WHERE CONTAINS(Keywords, ' "SA-300" ') 

vi un ejemplo de lo que está tratando de hacer en msdn.

+2

De su pregunta, él intentó eso. – GregD

+0

No sabía si el espacio en blanco importaba. Supongo que no. – ScArcher2

0

¿Has echado un vistazo a tu archivo de palabras irrelevantes? En mi máquina se encuentra aquí c: \ Archivos de programa \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ FTData \ noiseENG.txt

Una manera de probar esto es editando su archivo de ruido en particular con un solo espacio para que indexe todo e intente su consulta nuevamente. Yo "probaría" esto en un entorno de prueba y no en producción.

4

Resulta que necesitaba volver a crear mi índice de texto completo. Gracias por las sugerencias @MichaelGG y @JohnFx

1

¡Ah! Gracias @GregD. Tuvimos una búsqueda que no buscaba la cadena "esto nunca termina" cuando buscamos "this *" o "never *". Resulta ambas palabras están en noiseENG.txt.

No parece como que es posible desactivar esta opción en función de cada consulta, pero en base a esto: SQL 2008: Turn off Stop Words for Full Text Search Query

me encontré

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

y empezamos a conseguir los resultados que querido.

Cuestiones relacionadas