Domanda

Ho creato un archivio dati a più colonne su una tabella che mi consente di eseguire l'indicizzazione di testo completo sulla tabella. Quello che devo fare è ponderare ogni colonna in modo diverso e sommare i punteggi insieme.

La seguente query funziona, ma è lenta:

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

Dopo un bel po 'di Google, le persone hanno proposto la soluzione come:

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 query sopra è più veloce del suo predecessore ma non risolve il problema reale. In questo caso, se la parola chiave si trova nel documentTitle, non cercherà il documentText (utilizza l'operatore OR). Ciò di cui ho veramente bisogno è AGGIUNGERE i due punteggi insieme in modo che se una parola chiave appare nel titolo E nel testo avrà un punteggio più alto rispetto a se appare solo nel titolo.

Quindi, come si aggiungono i punteggi per le colonne ponderate in una clausola CONTAINS?

È stato utile?

Soluzione

Invece dell'operatore OR, utilizzare ACCUM:

SELEZIONA documento. *, Punteggio (1) come Punteggio DA documento DOVE CONTIENE (fittizio, '(((the_keyword) all'interno di documentTitle)) * 2 ACCUM ((the_keyword) all'interno di documentText)', 1) > 0) ORDINA PER Punteggio Desc

Altri suggerimenti

Cosa succede se si esegue una selezione nidificata?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top