Как вы сложите веса вместе в текстовом индексе оракула? - PullRequest
1 голос
/ 24 октября 2008

Я создал хранилище данных с несколькими столбцами в таблице, которое позволяет мне выполнять полнотекстовую индексацию таблицы. Что мне нужно сделать, так это оценить каждый столбец по-разному и сложить оценки вместе.

Следующий запрос работает, но медленно:

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). Что мне действительно нужно, так это ДОБАВИТЬ две оценки вместе, чтобы, если ключевое слово появилось в заголовке И текст, оно получило более высокую оценку, чем если бы оно появилось только в заголовке.

Итак, как вы добавляете баллы для взвешенных столбцов в одном предложении CONTAINS?

Ответы [ 2 ]

3 голосов
/ 24 октября 2008

Вместо оператора ИЛИ используйте ACCUM:

ВЫБРАТЬ документ. *, Оценка (1) как Оценка ОТ документа ГДЕ СОДЕРЖИТСЯ (dummy, '(((the_keyword) внутри documentTitle)) * 2 ACCUM ((the_keyword) в documentText)', 1)> 0) ЗАКАЗАТЬ ПО Счету Desc

0 голосов
/ 24 октября 2008

Что делать, если вы делаете вложенный выбор?

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
...