Oracleテキストインデックスでどのように重みを追加しますか?
-
04-07-2019 - |
質問
テーブルにフルテキストインデックスを作成できるように、テーブルに複数列のデータストアを作成しました。できるようにする必要があるのは、各列に異なる重みを付け、スコアを合計することです。
次のクエリは機能しますが、遅いです:
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
かなりの数のグーグルの後、人々は次のように解決策を提案しました:
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
上記のクエリは前のクエリよりも高速ですが、実際の問題は解決しません。この場合、キーワードがdocumentTitleで見つかった場合、documentTextは検索されません(OR演算子を使用します)。私が本当に必要なのは、キーワードがタイトルとテキストに表示される場合、タイトルにのみ表示される場合よりも高いスコアを持つように、2つのスコアを加算することです。
では、1つのCONTAINS句で加重列のスコアをどのように追加しますか?
解決
OR演算子の代わりに、ACCUMを使用します:
SELECT document。*、スコアとしてScore(1) FROMドキュメント WHERE CONTAINS(dummy、 '(((the_keyword)within documentTitle))* 2 ACCUM ((the_keyword)within documentText)'、1)> 0) ORDER BYスコアの説明
他のヒント
ネストされた選択を行うとどうなりますか?
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
所属していません StackOverflow