Как вы сложите веса вместе в текстовом индексе оракула?

StackOverflow https://stackoverflow.com/questions/233564

Вопрос

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

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top