Diferença significativa entre contém e conterstable?
-
25-09-2019 - |
Pergunta
Eu tenho um índice de texto completo criado em uma coluna do tipo varchar (max) com o FileStream ativado. O FileStream contém dados como JPG, TIF, PDF e XML (embora isso seja principalmente irrelevante para a pergunta, acredito).
Tenho duas consultas que criei que me permitem pesquisar no índice.
Pesquisa de texto 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'
Pesquisa de 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'
A única diferença significativa entre as duas pesquisas de texto completo é a consulta nº 1, os usos contém e a consulta nº 2 usa o contentStable.
Meu problema é que as duas consultas nem sempre produzem os mesmos resultados. Por exemplo, se eu pesquise na frase "contratados independentes", a consulta nº 1 produzia um conjunto de resultados de 10 documentos diferentes (PDFs e XML), enquanto a consulta nº 2 produziria apenas um conjunto de resultados de 6. Isso parece ser A regra: a consulta nº 1 sempre produz mais alguns que a consulta nº 2, e a consulta nº 2 sempre produz exatamente as mesmas correspondências que a consulta nº 1 faz.
Consulta #1 - Pesquise em "contratados independentes" rendimentos:
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 - Pesquise em rendimentos de "contratados independentes":
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
Solução
top_n_by_rank
Especifica que apenas as partidas mais classificadas do NHA, em ordem descendente, são devolvidas. Aplica -se apenas quando um valor inteiro, n, é especificado. Se TOP_N_BY_RANK for combinado com outros parâmetros, a consulta poderá retornar menos linhas do que o número de linhas que realmente correspondem a todos os predicados.
Tente correr com o OA em cima e veja se ele corresponde CONTAINS
.