Oracle Text: Как не подсчитать часть запроса для скоринга?
У меня есть многоколоночное хранилище данных, проиндексированное с использованием Oracle Text, и я выполняю запросы с использованием ключевого слова Contains.
Чтобы по-разному взвешивать различные столбцы, я действую следующим образом.
Если пользователь ищет слово "ужасный", запрос к oracle будет выглядеть следующим образом:
WHERE CONTAINS(indexname,
'((horrible WITHIN column1) * 3)
OR ((horrible WITHIN column2) * 2))') > 1
Но чтобы добавить фильтр категорий, который также индексируется, я делаю это:
WHERE CONTAINS(indexname,
'((horrible WITHIN Column1) * 3)
OR ((horrible WITHIN Column2) * 2))
AND (movie WITHIN CategoryColumn)', 1) > 1
Это фильтрует по категориям, но это полностью портит оценку, потому что текст Oracle будет иметь наименьшую оценку с любой стороны ключевого слова AND. Вместо этого я хотел бы поручить оракулу игнорировать правую часть моего AND.
Есть ли способ, чтобы эта конкретная часть запроса игнорировалась оценкой?
В основном, я хочу забить в соответствии с
(horrible WITHIN Column1) * 3
OR (horrible WITHIN Column2) * 2)
но я хочу выбрать в соответствии с
'((horrible WITHIN Column1) * 3)
OR ((horrible WITHIN Column2) * 2))
AND (movie WITHIN CategoryColumn)'
1 ответ
Есть упоминание о
Укажите, как следует объединять оценку из дочерних элементов операторов OR и AND.
в Oracle Docs в разделе Альтернативный и пользовательский скоринг, но примеров не так много.
Использование релаксации запросов может быть проще в этом случае (если это работает), например:
where CONTAINS (indexname,
'<query>
<textquery lang="ENGLISH" grammar="CONTEXT">
<progression>
<seq>(horrible WITHIN Column1) AND (movie WITHIN CategoryColumn)</seq>
<seq>(horrible WITHIN Column2) AND (movie WITHIN CategoryColumn)</seq>
</progression>
</textquery>
<score datatype="INTEGER" algorithm="COUNT"/>
</query>')>0;
Таким образом, вам не нужно присваивать веса, так как результат более расслабленного запроса никогда не превышает предыдущий по порядку.