Domanda

Ho un indice full-text creato su una colonna di tipo varchar (max) con filestream abilitato. Il FileStream contiene dati come JPG di, TIF di, PDF e XML di (anche se questo è per lo più irrilevante per la questione, credo).

Ho due domande che ho creato che mi permettono di cercare sul indice.

ricerca full-text # 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'

ricerca full-text # 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'

L'unica differenza significativa tra i due ricerche full-text è di query # 1 usi contiene e query # 2 utilizza CONTAINSTABLE.

Il mio problema è che le due interrogazioni non sempre producono gli stessi risultati. Ad esempio, se io per cercare la frase "imprenditori indipendenti", interrogare # 1 porterebbe a un set di risultati di 10 documenti diversi (PDF e XML di), mentre interrogazione 2 # sarebbe cedere solo un set di risultati di 6. Questo sembra essere la regola: query # 1 produce sempre un poco più di interrogazione 2 #, e Query 2 # produce sempre esattamente le stesse partite che interrogazione 1 # fa.

Domanda # 1 - Ricerca su "contractors Indipendenti" si ottiene:

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

Domanda # 2 - una ricerca sulle "appaltatori Indipendenti" si ottiene:

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
È stato utile?

Soluzione

CONTAINSTABLE :

  

top_n_by_rank

     

Specifica che solo il nhighest partite classificate, in ordine decrescente,   vengono restituiti. Si applica solo quando un   intero valore n è specificato. Se   top_n_by_rank è combinato con altri   parametri, la query potrebbe tornare   meno righe rispetto al numero di righe   che in realtà corrispondere tutte le   predicati.

Prova in esecuzione w / o un top e vedere se corrisponde CONTAINS.

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