2009-02-25 4 views
13

Ho una tabella prodotti in un database SQL Server e devo risolvere una procedura memorizzata legacy che utilizza l'indicizzazione full-text. Per i nostri scopi qui, supponiamo che la tabella Prodotti abbia due ID campo, Parole chiave. E il campo Parole viene compilato con il seguente:Problema SQL: l'uso di CONTAINS() non funziona, ma funziona come LIKE

ROLAND SA-300 per il Roland SA-300 è in ottime condizioni!

Quando eseguo la seguente dichiarazione, sono in grado di recuperare il record:

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

Tuttavia, quando si esegue una qualsiasi delle seguenti affermazioni ottengo zero risultati:

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*"') 

Ma so che la funzione CONTAINS() funziona perché ottengo risultati quando eseguo una di queste attività:

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') 

Ho bisogno di capire perché la funzione CONTAINS() non funziona sul termine 'SA-300'. Sono nuovo agli indici full-text, quindi ogni aiuto è apprezzato.

+2

Nessun indizio, ma hai controllato che l'indice sia aggiornato? – MichaelGG

risposta

13

due pensieri:

(1) Il trattino può essere trattato come una pausa parola Cosa fare queste cambio?

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

Vedere questo other question.

(2) Hai provato a ricostruire l'indice full-text? È possibile che non sia aggiornato.

+0

# 2 era corretto. Grazie – jessegavin

-1

Puoi provare

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

Ho visto un esempio di ciò che si sta cercando di fare il msdn.

+2

Dalla sua domanda, ci ha provato. – GregD

+0

Non sapevo se lo spazio bianco fosse importante. Non credo. – ScArcher2

0

Hai dato un'occhiata al tuo file di parole non significative? Sulla mia macchina si trova qui c: \ Programmi \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ FTData \ noiseENG.txt

Un modo per testare questo è modificare il particolare file di rumore con un solo spazio in modo che indicizzi tutto e riprovi la tua query. Lo "testerei" in un ambiente di test e non in produzione.

4

Risulta che ho bisogno di ricostruire il mio indice full-text. Grazie per i suggerimenti @MichaelGG e @JohnFx

1

Ah! Grazie a @GregD. Abbiamo avuto una ricerca che non stava trovando la stringa "questo non finisce mai" quando cerchi "questo *" o "mai *". Risulta che entrambe le parole sono in noiseENG.txt.

Non sembra come se fosse possibile disattivare questo una base per-query, ma sulla base di questo: SQL 2008: Turn off Stop Words for Full Text Search Query

mi sono imbattuto

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

e abbiamo iniziato a ottenere i risultati che abbiamo ricercato.