【问题标题】:Oracle 'Contains' / 'Group' function return incorrect valueOracle 'Contains' / 'Group' 函数返回不正确的值
【发布时间】:2014-02-05 09:02:01
【问题描述】:

我有这个问题:

SELECT last_name, SCORE(1)  
FROM Employees  
WHERE CONTAINS(last_name, '%sul%', 1) > 0  

它在下面产生输出:

问题是:
为什么SCORE(1) 会产生 9?我记得CONTAINS 函数返回 search_string 的出现次数(在本例中为 '%sul%')。

我希望输出应该是:
沙利文 1
苏利 1

但是当我尝试这种语法时:

SELECT last_name, SCORE(1)
FROM Employees
WHERE CONTAINS(last_name, 'sul', 1) >0;

它返回选择的 0 行。

有人可以解释一下第三个参数是什么吗?

提前致谢:)

【问题讨论】:

    标签: sql oracle oracle10g contains


    【解决方案1】:

    您的第二个查询没有返回任何行的原因是,您在搜索中寻找 word sul包含 不会进行模式搜索,除非您告诉它,它会搜索您指定为第二个参数的单词。要查找模式,您必须使用通配符,就像您在第一个示例中所做的那样。

    现在,来到CONTAINS 中的第三个参数——它是label,仅用于标记分数运算符。当您在 SELECT 列表中使用 SCORE 时,您应该使用第三个参数。当有多个SCORE 运算符时,其重要性更加明显

    直接引用文档

    标签

    指定一个数字来标识查询产生的分数。 使用这个数字来标识返回这个的 CONTAINS 子句 得分。

    示例

    单个包含

    当调用 SCORE 运算符时(例如,在 SELECT 子句中), CONTAINS 子句必须引用分数标签值,如 下面的例子:

    SELECT SCORE(1), title from newsindex 
                WHERE CONTAINS(text, 'oracle', 1) > 0 ORDER BY SCORE(1) DESC;
    

    多个包含

    假设新闻数据库存储和索引标题和正文 新闻文章分开。以下查询返回所有 标题中包含单词 Oracle 和 in 中包含 java 的文档 他们的身体。文章按第一名的分数排序 CONTAINS (Oracle) 然后由分数为第二个 CONTAINS (java)。

    SELECT title, body, SCORE(10), SCORE(20) FROM news WHERE CONTAINS
     (news.title, 'Oracle', 10) > 0 OR CONTAINS (news.body, 'java', 20) > 0
     ORDER BY SCORE(10), SCORE(20);
    

    【讨论】:

    • 所以基本上第三个参数(标签)只是分数的标识符/索引?在您所说的多重包含部分The following query returns all the documents that include the words Oracle in their title and java in their body,这意味着它将返回包含Oraclejava 的任何内容,对吗?但是您没有使用通配符。我很困惑>_
    • 是的,它只是一个标识符。关于查询示例,是的,查询将搜索包含OracleJava 的所有列。我没有用过通配符,所以如果Java字的Oracle后面直接有什么,比如OracleEJavac,是不会返回的,因为我是专门找Oracle或者Java
    • 好的,我理解那部分,但你能解释一下我是如何得到每行 9 的吗?
    【解决方案2】:

    Oracle Text Scoring Algorithm 不会通过简单地计算出现次数来得分。它使用基于Salton公式的逆频率算法。

    逆频率评分假设文档集中频繁出现的词是噪声词,因此这些词的得分较低。对于一个得分高的文档,查询词必须在文档中频繁出现,但在整个文档集中很少出现。

    想想谷歌搜索。如果您搜索术语Oracle,您将找不到(直接)任何可能有助于解释您的评分值问题的结果,因此我们可以将此术语视为您期望的“噪音”。但是,如果您搜索术语Oracle Text Scoring Algorithm,您将在第一个谷歌结果中找到您的答案。

    关于你的其他问题,我认为@Incognito 已经给了他们一个很好的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      相关资源
      最近更新 更多