Я создал хранилище данных с несколькими столбцами в таблице, которое позволяет мне выполнять полнотекстовую индексацию таблицы. Что мне нужно сделать, так это взвесить каждый столбец по-разному и сложить баллы.
Следующий запрос работает, но работает медленно:
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 АККУМ ((the_keyword) в documentText)', 1)> 0) ЗАКАЗАТЬ Оценка по убыванию
Что, если вы сделаете вложенный выбор?
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
Этот ответ был идеальным. Я думал, вы можете НАБИРАТЬ только термины вместе, а не веса.