Как вы сложите веса вместе в текстовом индексе оракула?
-
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
После недолгого поиска в Google люди предложили решение следующим образом:
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? Р>
Решение
Вместо оператора OR используйте ACCUM:
ВЫБРАТЬ документ. *, Оценка (1) как Оценка ОТ документа ГДЕ СОДЕРЖИТСЯ (dummy, '(((the_keyword) внутри documentTitle)) * 2 ACCUM ((the_keyword) в documentText)', 1) > 0) ЗАКАЗАТЬ по счету Desc
Другие советы
Что если вы сделаете вложенный выбор?
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