1

我有一个使用 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 关键字的任何一侧获得最低分数。相反,我想指示 oracle 忽略 AND 的右侧。

有没有办法让评分忽略查询的这个特定部分?

基本上,我想根据

(horrible WITHIN Column1) * 3 
OR (horrible WITHIN Column2) * 2) 

但我想根据

'((horrible WITHIN Column1) * 3) 
 OR ((horrible WITHIN Column2) * 2))
 AND (movie WITHIN CategoryColumn)'
4

1 回答 1

1

有提到

指定应如何合并 OR 和 AND 运算符的子元素的分数。

在 Oracle Docs 的Alternative and User-defined Scoring部分中,但没有很多示例。

在这种情况下使用查询松弛可能会更简单(如果有效),例如:

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;

这样您就不需要分配权重,因为从更宽松的查询中获得的评分永远不会超过顺序中的前一个。

于 2013-05-24T16:23:35.547 回答