Domanda

Attualmente sto lavorando su un'applicazione in cui disponiamo di un database SQL-Server e ho bisogno di far funzionare una ricerca a testo completo che ci consenta di cercare i nomi delle persone.

Attualmente l'utente può inserire un nome in un campo che cerca 3 diversi cols varchar.Nome, cognome, secondo nome

Quindi diciamo che ho 3 righe con le seguenti informazioni.

1 - Filippo - J - Fry

2 - Amy - NULL - Wong

3 - Leone - NULL - Wong

Se l'utente inserisce un nome come "Fry", restituirà la riga 1.Tuttavia se entrano in Phillip Fry, o Fr, o Phil non ottengono nulla.e non capisco perché lo fa.Se cercano Wong ottengono le righe 2 e 3, se cercano Amy Wong non ottengono nulla.

Attualmente la query utilizza CONTAINSTABLE ma l'ho cambiato con FREETEXTTABLE, CONTAINS e FREETEXT senza alcuna differenza evidente nei risultati.I metodi tabellari sono da preferire perché restituiscono gli stessi risultati ma con classificazione.

Ecco la domanda.

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)
SET @SearchString = '"'+@Name+'"'
SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

Qualche idea...?Perché questa ricerca nel testo completo non funziona correttamente?

È stato utile?

Soluzione 3

Grazie per le risposte ragazzi, finalmente sono riuscito a farlo funzionare.Con parte delle risposte di Biri e Kibbee.Avevo bisogno di aggiungere * alla stringa e suddividerla negli spazi per poter funzionare.Quindi alla fine ho ottenuto

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)

--Added this line
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*')
SET @SearchString = '"*'+@SearchString+'*"'

SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

Ci sono più campi in cui effettuare la ricerca. L'ho semplicemente semplificato per la domanda, mi dispiace, non pensavo che avrebbe influenzato la risposta.In realtà cerca anche una colonna che ha un CSV di soprannomi e una colonna di note.

Grazie per l'aiuto.

Altri suggerimenti

FreeTextTable dovrebbe funzionare.

INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 

@SearchString dovrebbe contenere valori come "Phillip Fry" (una lunga stringa contenente tutte le stringhe di ricerca separate da spazi).

Se desideri cercare Fr o Phil, dovresti utilizzare l'asterisco:Phil* e Fr*

"Phil" sta cercando esattamente la parola "Phil".'Phil*' cerca ogni parola che inizia con 'Phil'

Se stai cercando solo i nomi delle persone, potrebbe essere nel tuo interesse non utilizzare nemmeno l'indice del testo completo.L'indice di testo completo ha senso quando hai campi di testo di grandi dimensioni, ma se hai a che fare principalmente con una parola per campo, non sono sicuro di quanto extra potresti ottenere dagli indici di testo completo.Aspettare che l'indice del testo completo si reindicizzi prima di poter cercare nuovi record può essere uno dei tanti problemi.

Potresti semplicemente fare una query come la seguente.Dividi la stringa di ricerca negli spazi e crea un elenco dei termini di ricerca.

Select FirstName,MiddleName,LastName 
From person 
WHERE 
Firstname like @searchterm1 + '%'
or MiddleName like @searchterm1 + '%'
or LastName like @searchterm1 + '%'
or Firstname like @searchterm2 + '%'
etc....

Un altro approccio potrebbe essere quello di astrarre la ricerca dai singoli campi.

In altre parole, crea una vista sui tuoi dati che trasforma tutti i campi divisi come nome e cognome in campi concatenati, ad es.nome e cognome

Quindi cerca nella vista.Ciò probabilmente semplificherebbe la query di ricerca.

Potresti voler dare un'occhiata Lucene.net in alternativa al testo completo.

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