Como você adicionar pesos juntos em um índice de texto oráculo?
-
04-07-2019 - |
Pergunta
Eu criei um armazenamento de dados de coluna múltiplos em uma tabela que me permite fazer a indexação de texto completo sobre a mesa. O que eu preciso ser capaz de fazer é de peso cada um diferente coluna e adicione a pontuação juntos.
As seguintes obras de consulta, mas é 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
Depois de um pouco de Googling, as pessoas têm proposto a solução como:
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
A consulta acima é mais rápido que seu antecessor, mas isso não resolve o problema real. Neste caso, se a palavra-chave é encontrada no DocumentTitle, não vai procurar o DocumentText (ele usa o operador OR). O que eu realmente precisa é adicionar as duas pontuações em conjunto de modo que se uma palavra-chave aparece no título e no texto que vai ter uma pontuação maior do que se ele só aparece no título.
Então, como você adicionar as pontuações para colunas ponderada em um contém cláusula?
Solução
Em vez do operador OR, uso ACCUM:
documento SELECT. *, Score (1) como Score DE documento ONDE CONTÉM (dummy '(((the_keyword) dentro DocumentTitle)) * 2 ACCUM ((the_keyword) dentro DocumentText)', 1)> 0) ORDER BY Pontuação desconto
Outras dicas
E se você fizer um SELECT aninhada?
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