2012-07-25 13 views
7

Tenemos una aplicación que utiliza una base de datos de SQL Server 2008 y una búsqueda de texto completo. Estoy tratando de entender por qué las siguientes búsquedas comportan de manera diferente:La búsqueda de texto completo de SQL Server que contiene un guión no arroja los resultados esperados

En primer lugar, una frase que contiene una palabra con guión, como esto:

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

Y en segundo lugar, una misma frase, en donde los guiones se sustituyen por espacios :

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

el índice de texto completo utiliza el inglés (1033) donde se encuentre y la lista de palabras irrelevantes del sistema por defecto.

A partir de mis observaciones de otras búsquedas de texto completo que contengan palabras con guiones, la primera debe permitir coincidencias en one two three four five o one twothreefour five. En cambio, solo coincide con one twothreefour five (y no con one two-three-four five).


caso de prueba

Configuración:

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 

Consultas:

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

Limpieza:

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

Respuesta

7

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

"¿Dónde carácter no alfanumérico debe ser utilizado en el critera de búsqueda (principalmente el guión carácter '-'), utilice la cláusula de Transact-SQL LIKE en lugar de con el texto completo o contiene predicados."

+1

La pregunta es más acerca de por qué * * servidor SQL muestra un comportamiento diferente para la coincidencia.Trabajar a su alrededor es ciertamente factible, pero simplemente no tiene sentido para mí que "dos-tres-cuatro-cinco" regrese a ambas filas, sin embargo "uno dos-tres-cuatro-cinco" no lo hará. Lo mismo para "uno dos-tres-cuatro". ¿Es este comportamiento realmente esperado? y si es así, ¿por qué? – Laviak

5

En casos como estos en los que no se puede anticipar el comportamiento del separador de palabras, siempre es una buena idea ejecutar sys.dm_fts_parser en sus cadenas para tener una idea de cómo se dividirán y almacenarán las palabras en el índice interno.

Por ejemplo, correr en sys.dm_fts_parser ' 'uno, dos, tres, cuatro y cinco'' Resultados de la siguiente -

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 

Como se puede ver en los resultados devueltos, el separador de palabras analiza el secuencia y salidas de seis formas que pueden explicar los resultados que se ven al ejecutar su consulta CONTAINS.

1

Una búsqueda de texto completo considera que una palabra es una cadena de caracteres sin espacios ni signos de puntuación. La aparición de un carácter no alfanumérico puede "romper" una palabra durante una búsqueda. Debido a que la búsqueda de texto completo de SQL Server es un motor basado en palabras, la puntuación generalmente no se tiene en cuenta y se ignora cuando se busca en el índice. Por lo tanto, una cláusula CONTAINS como 'CONTAINS (prueba,' falla de la computadora ')' coincidiría con una fila con el valor "La falla para encontrar mi computadora sería costosa".

Por favor, siga el enlace de por qué: https://support.microsoft.com/en-us/kb/200043

Cuestiones relacionadas