Question

J'ai créé un magasin de données multi-colonnes sur une table qui me permet d'indexer du texte intégral sur la table. Ce que je dois pouvoir faire, c'est pondérer chaque colonne différemment et additionner les scores.

La requête suivante fonctionne, mais est lente:

SELECT document.*, Score(1) + 2*Score(2) as Score
FROM document
WHERE (CONTAINS(documentContent, 'the_keyword', 1) > 0
OR CONTAINS(documentTitle, 'the_keyword', 2) > 0 )
ORDER BY Score DESC

Après un peu de recherche sur Google, les gens ont proposé la solution comme suit:

SELECT document.*, Score(1) as Score
FROM document
WHERE CONTAINS(dummy, '(((the_keyword) within documentTitle))*2 OR ((the_keyword) within documentText)',1) > 0)
ORDER BY Score Desc

La requête ci-dessus est plus rapide que son prédécesseur, mais elle ne résout pas le problème. Dans ce cas, si le mot clé est trouvé dans le documentTitle, il ne cherchera pas le documentText (il utilise l'opérateur OR). Ce dont j'ai vraiment besoin, c’est d’AJOUTER les deux partitions ensemble afin que, si un mot clé apparaît dans le titre ET dans le texte, il obtiendra une note plus élevée que si elle figurait uniquement dans le titre.

Alors, comment ajoutez-vous les scores des colonnes pondérées dans une clause CONTAINS?

Était-ce utile?

La solution

Au lieu de l'opérateur OR, utilisez ACCUM:

SELECTIONNER le document. *, Score (1) en tant que Score Du document WHERE CONTAINS (dummy, '(((the_keyword) dans le documentTitle)) * * 2 ACCUM ((the_keyword) dans le documentText)', 1) > 0) ORDER BY Score Desc

Autres conseils

Et si vous faites une sélection imbriquée?

select *, Score(1) + 2 * Score(2) as Score
from (
    SELECT document.*, Score(1) as Score
    FROM document
    WHERE CONTAINS(dummy, '(((the_keyword) within documentTitle))
        OR ((the_keyword) within documentText)',1) > 0)
)
ORDER BY Score Desc
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top