【问题标题】:Oracle Text : How to not count a part of the query for scoring?Oracle Text:如何不计分查询的一部分?
【发布时间】:2013-05-24 12:15:17
【问题描述】:

我有一个使用 Oracle Text 索引的多列数据存储,并且我正在使用 Contains 关键字运行查询。
为了对不同的列进行不同的加权,我按照以下步骤进行操作。

如果用户搜索“horrible”,则向 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)'

【问题讨论】:

    标签: oracle10g scoring oracle-text weighting


    【解决方案1】:

    提到了

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

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

    在这种情况下使用query relaxation 可能会更简单(如果可行的话),例如:

    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;
    

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

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2011-10-28
      • 1970-01-01
      相关资源
      最近更新 更多