2009-11-26 16 views
9

Possiedo quello che penso sia uno scenario molto semplice, ma quello che ho letto fa sembrare che questo non sia facile utilizzando gli indici e il catalogo completo di SQL Server.Più colonne con ContainsTable e logica booleana con indice di testo completo

Ho 2 colonne, nome e cognome. Voglio supportare la ricerca full-text su di essi in modo tale che se qualcuno digita "John Smith" persone con una corrispondenza su sia sia prima che l'ultima arrivino per prime.

Sebbene sia facile creare un indice su più colonne e facile ricercare più colonne, il punteggio non riflette più colonne.

SELECT [Key], Rank 
FROM CONTAINSTABLE([User], (FirstName,LastName), '<CLAUSE_HERE>') 
  1. Se CLAUSE_HERE è "John Smith" non ottengo risultati, perché quella frase non esiste in entrambi i campi.
  2. Se è "john OR smith" ottengo tutti gli utenti con entrambi i nomi in entrambi i campi, ordinati in un ordine non utile.
  3. Se è "john AND smith" non ottengo risultati, perché nessuno dei due campi contiene entrambe le parole.

sembra l'unica soluzione è quella di autogenerate una query che viene eseguito containstable su ogni campo, non certo per la matematica, somma i punteggi, ecc Fa questo diritto del suono? C'è un modo più semplice per aggirarlo? La mia query attuale contiene molti più campi: questo è un esempio semplificato.

risposta

11

Crea un computed column che raccoglie insieme i campi a cui sei interessato a cercare (in un modo che abbia senso per i tuoi formati di ricerca) e che indichi tutto il testo.

Per quanto ne so, questo è l'unico problema se si desidera eseguire full-text in questo modo a causa del comportamento descritto nella domanda.

+0

Completamente funzionante !! Perché il testo completo non lo fa automaticamente? Ho pensato che applicare il testo completo su più colonne avrebbe funzionato in modo così immediato. non lo so. –

0

Avresti bisogno di testarlo, ma mi chiedo se potresti essere in grado di utilizzare la funzione ISABOUT() per applicare un peso a ciascuna parola chiave. La tua clausola di ricerca potrebbe essere:

ISABOUT(john weight(0.2), smith weight(0.8)) 
+0

Non è una cattiva idea, ma non funziona. Il modo in cui funziona il punteggio non sembra sommare tra le colonne. Quindi, "John Smith" ha lo stesso punteggio di "John Jones" nei miei test. –

+0

Quale versione di SQL Server stai usando? Hai uno script di esempio/test? – RickNZ

Problemi correlati