diferencia significativa entre los contiene y CONTAINSTABLE?
-
25-09-2019 - |
Pregunta
Tengo un índice de texto creado sobre una columna de tipo varchar (max) con filestream habilitado. El filestream contiene datos tales como JPG de, TIF, PDF y XML de (aunque esto es sobre todo irrelevante para la cuestión, creo).
Tengo dos consultas que he creado que me permiten para buscar en el índice.
buscartexto completo # 1 -
select
parentObj.ObjectID as 'GroupingID',
parentObj.Name as 'Grouping',
childObj.ObjectID as 'FileObjID',
childObj.Name as 'FileName',
fs.FileStreamID
from dbo.dat_FileStream fs
inner join dbo.dat_Object childObj
on fs.ObjectID = childObj.ObjectID
inner join dbo.dat_Collection c
on fs.ObjectID = c.ObjectID
inner join dbo.dat_Object parentObj
on c.ParentID = parentObj.ObjectID
where contains(FileStreamData, @srchTerm)
and parentObj.ObjectTypeID = 1
ORDER BY 'Grouping'
buscar texto completo # 2 -
select
KEY_TBL.RANK,
parentObj.ObjectID as 'GroupingID',
parentObj.Name as 'Grouping',
childObj.ObjectID as 'FileObjID',
childObj.Name as 'FileName',
fs.FileStreamID
from dbo.dat_FileStream fs
inner join containstable(dbo.dat_FileStream, FileStreamData, @srchTerm, 1000) as KEY_TBL
on fs.FileStreamID = KEY_TBL.[KEY]
inner join dbo.dat_Object childObj
on fs.ObjectID = childObj.ObjectID
inner join dbo.dat_Collection c
on fs.ObjectID = c.ObjectID
inner join dbo.dat_Object parentObj
on c.ParentID = parentObj.ObjectID
where parentObj.ObjectTypeID = 1
ORDER BY 'Grouping'
La única diferencia significativa entre las dos búsquedas de texto completo es la consulta # 1 contiene usos y consulta # 2 usos CONTAINSTABLE.
Mi problema es que las dos consultas no siempre producen los mismos resultados. Por ejemplo, si yo fuera a buscar la frase "contratistas independientes", consulta # 1 produciría un conjunto de resultados de 10 documentos diferentes (PDF y XML de), mientras que la consulta # 2 sólo se produciría un conjunto de resultados de 6. Esto parece ser la regla: la consulta # 1 siempre produce un poco más de la consulta # 2, # 2 y consulta siempre produce exactamente los mismos partidos que consulta # 1 hace.
Consulta # 1 - búsqueda en "contratistas independientes" se obtiene:
4262 AAA-00-12 4561 AAA-00-12.pdf 4235
4316 AAA-00-15 4753 AAA-00-15.pdf 4427
4316 AAA-00-15 4754 AAA-00-15.xml 4428
3873 AAA-00-19 4784 AAA-00-19.pdf 4458
3903 AAA-00-22 6795 AAA-00-22.pdf 6459
3953 AAA-00-24 6899 AAA-00-24.pdf 6563
3953 AAA-00-24 6900 AAA-00-24.xml 6564
4842 AAA-00-9 4905 AAA-00-9.pdf 4577
4842 AAA-00-9 4906 AAA-00-9.xml 4578
4057 AAA-0001 4260 AAA-0001.pdf 3936
Consulta # 2 - búsqueda en "contratistas independientes" se obtiene:
19 4262 AAA-00-12 4561 AAA-00-12.pdf 4235
126 4316 AAA-00-15 4754 AAA-00-15.xml 4428
126 4316 AAA-00-15 4753 AAA-00-15.pdf 4427
116 3873 AAA-00-19 4784 AAA-00-19.pdf 4458
125 3903 AAA-00-22 6795 AAA-00-22.pdf 6459
57 3953 AAA-00-24 6900 AAA-00-24.xml 6564
57 3953 AAA-00-24 6899 AAA-00-24.pdf 6563
Solución
top_n_by_rank
Especifica que sólo el nhighest partidos igualados, en orden descendente, son devueltos. Sólo se aplica cuando una número entero de valor, n, se especifica. Si top_n_by_rank se combina con otro parámetros, la consulta podría volver un menor número de filas que el número de filas que de hecho coincidir con toda la predicados.
Trate de correr w / o una parte superior y ver si coincide con CONTAINS
.