2012-07-25 4 views
7

Abbiamo un'applicazione che utilizza un database SQL Server 2008 e una ricerca full-text. Sto cercando di capire perché i seguenti ricerche comportano in modo diverso:La ricerca full-text di SQL Server per la frase contenente un trattino non restituisce i risultati previsti

In primo luogo, una frase che contiene una parola sillabata, in questo modo:

contains(column_name, '"one two-three-four five"') 

E in secondo luogo, una frase identica, dove i trattini sono sostituiti da spazi :

contains(column_name, '"one two three four five"') 

L'indice di testo completo utilizza l'impostazione locale INGLESE (1033) e l'elenco di arresto predefinito del sistema.

Dalle mie osservazioni di altre ricerche full-text contenenti parole con trattino, il primo deve consentire le corrispondenze su one two three four five o one twothreefour five. Invece, corrisponde solo a one twothreefour five (e non a one two-three-four five).


banco di prova

Setup:

create table ftTest 
(
    Id int identity(1,1) not null, 
    Value nvarchar(100) not null, 
    constraint PK_ftTest primary key (Id) 
); 

insert ftTest (Value) values ('one two-three-four five'); 
insert ftTest (Value) values ('one twothreefour five'); 

create fulltext catalog ftTest_catalog; 
create fulltext index on ftTest (Value language 1033) 
    key index PK_ftTest on ftTest_catalog; 
GO 

Query:

--returns one match 
select * from ftTest where contains(Value, '"one two-three-four five"') 

--returns two matches 
select * from ftTest where contains(Value, '"one two three four five"') 
select * from ftTest where contains(Value, 'one and "two-three-four five"') 
select * from ftTest where contains(Value, '"one two-three-four" and five') 
GO 

Cleanup:

drop fulltext index on ftTest 
drop fulltext catalog ftTest_catalog; 
drop table ftTest; 

risposta

7

http://support.microsoft.com/default.aspx?scid=kb;en-us;200043

"Dove carattere non alfanumerico deve essere utilizzato nel critera di ricerca (in primo luogo il trattino carattere '-')., Utilizzare la clausola Transact-SQL LIKE invece del FULLTEXT o contiene predicati"

+1

La domanda è più su * perché * SQL server presenta un comportamento diverso per la corrispondenza.Lavorare in giro è certamente fattibile, ma semplicemente non ha senso per me che "due-tre-quattro cinque" restituirà entrambe le righe, tuttavia "uno due tre tre quattro" non lo faranno. Idem per "one two-three-four". Questo comportamento è davvero previsto? e se sì, perché? – Laviak

5

In casi come questi in cui non è possibile anticipare il comportamento dell'interruttore di parole, è sempre consigliabile eseguire sys.dm_fts_parser sulle stringhe per avere un'idea di come le parole verranno suddivise e memorizzate in l'indice interno.

Per esempio, in esecuzione su sys.dm_fts_parser ' 'uno due-tre-quattro cinque'' i risultati nella seguente -

select * from sys.dm_fts_parser('"one two-three-four five"', 1033, NULL, 0) 
--edited-- 
1 0 1 Exact Match one 
1 0 2 Exact Match two-three-four 
1 0 2 Exact Match two 
1 0 3 Exact Match three 
1 0 4 Exact Match four 
1 0 5 Exact Match five 

Come si può vedere dai risultati restituiti, la parola-breaker analizza il stringa e genera sei moduli che possono spiegare i risultati visualizzati durante l'esecuzione della query CONTAINS.

1

Una ricerca full-text considera una parola come una stringa di caratteri senza spazi o segni di punteggiatura. L'occorrenza di un carattere non alfanumerico può "spezzare" una parola durante una ricerca. Poiché la ricerca full-text di SQL Server è un motore basato su parole, la punteggiatura in genere non viene considerata e viene ignorata durante la ricerca nell'indice. Pertanto, una clausola CONTAINS come "CONTAINS (testing," computer-failure ")" corrisponderebbe a una riga con il valore "L'errore nel trovare il mio computer sarebbe costoso".

si prega di seguire il link per PERCHE ': https://support.microsoft.com/en-us/kb/200043