Domanda

Ho un testo tabella indicizzata completa in SQL Server 2008 che sto cercando di query per una corrispondenza esatta frase usando FULLTEXT. Non credo utilizzando contiene o simili è appropriato per questo, perché in altri casi, la query potrebbe non essere esatto (utente non fa frase Surround tra virgolette) e, in generale, voglio la flessibilità di FREETEXT.

Secondo il documentazione per FREETEXT [MSDN]:

Se freetext_string è racchiuso tra virgolette doppie, una partita frase viene invece eseguita; diraspatura e thesaurus non vengono eseguite.

che mi porterebbe a credere una query come questa:

SELECT Description  
FROM Projects   
WHERE FREETEXT(Description, '"City Hall"')  

sarebbe tornato solo i risultati in cui il termine "City Hall" appare nel campo Descrizione, ma invece io ottenere risultati come questo:

1 Esecuzione della rampa di handicap a Manning Hall.
2 indagine Antenna. Committente: Comune di Cranston Dipartimento di Ingegneria
3 indagini strutturali per quanto riguarda i danni da fuoco a International Tennis Hall of Fame.
indagine 4 Investigation tetto per la progettazione satellite proposto sul Herald Hall.
... etc

Ovviamente questi risultati comprendono almeno una delle parole la mia frase, ma non la frase stessa. Quel che è peggio, avevo pensato i risultati sarebbero stati classificati, ma i due risultati che in realtà volevo (perché includono la frase attuale) sono sepolti.

SELECT Description  
FROM Projects  
WHERE Description LIKE '%City Hall%'  

1 Maggiore esterno e la ristrutturazione interna del municipio esistente per Quincy Massachusetts
2 Una rapida indagine strutturale di Pawtucket Torre del Municipio afflitto da perdite.

Sono sicuro che questo è un caso di me non capire la documentazione, ma c'è un modo per ottenere quello che sto cercando? Vale a dire, per essere in grado di passare in una stringa di ricerca senza virgolette e ottenere esattamente quello che sto ottenendo ora o con le citazioni e ottenere solo la frase esatta?

È stato utile?

Soluzione

Come hai detto, FREETEXT guarda ogni parola nella vostra frase, non la frase come un tutto. Per questo è necessario utilizzare l'istruzione CONTAINS. In questo modo:

SELECT Description  
FROM Projects   
WHERE CONTAINS(Description, '"City Hall"')

Se si desidera ottenere il rango dei risultati, è necessario utilizzare CONTAINSTABLE. Funziona più o meno lo stesso, ma restituisce una tabella con due colonne: [Key] Quale contiene la chiave primaria della tabella di ricerca e [Rank], che vi dà il rango del risultato

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top