Oracle'包含'/'组'函数返回不正确的值

时间:2014-02-05 09:02:01

标签: sql oracle oracle10g contains

我有这个问题:

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

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

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

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

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

它返回0行。

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

提前致谢:)

2 个答案:

答案 0 :(得分:0)

您的第二个查询未返回任何行的原因是,您在搜索中寻找 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;
  

多个包含

     
    

假设新闻数据库存储并索引标题和正文     新闻文章分开。以下查询返回所有     在其标题和java中包含Oracle字样的文档     他们的身体。文章按第一个分数排序     包含(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);

答案 1 :(得分:0)

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

  

反向频率评分假设文档集中频繁出现的术语是噪声术语,因此这些术语得分较低。对于要获得高分的文档,查询术语必须在文档中频繁出现,但在文档集中不经常出现。

想想谷歌搜索。如果您搜索术语import java.util.ArrayList; public class Sorter { public static <T extends Comparable> boolean isInOrder(ArrayList<T> ar) { for (int i = 0; i < ar.size() - 1; i++) { if (ar.get(i).compareTo(ar.get(i + 1)) > 0) { return false; } } return true; } public static <T extends Comparable> boolean isInOrder(T[] ar) { for (int i = 0; i < ar.length - 1; i++) { if (ar[i].compareTo(ar[i + 1]) > 0) { return false; } } return true; } private static <T> ArrayList<T> splitArrayList(ArrayList<T> ar, int start, int end) { ArrayList<T> toReturn = new ArrayList<>(); for (int i = start; i < end; i++) { toReturn.add(ar.get(i)); } return toReturn; } private static <T extends Comparable> ArrayList<T> merge(ArrayList<T> a, ArrayList<T> b) { ArrayList<T> toReturn = new ArrayList<>(); int bIndex = 0; for (T value : a) { while (bIndex < b.size() && (b.get(bIndex).compareTo(value) < 0)) { toReturn.add(b.get(bIndex)); bIndex++; } toReturn.add(value); } if (bIndex <= b.size()) { for (int i = bIndex; i < b.size(); i++) { toReturn.add(b.get(i)); } } return toReturn; } public static <T extends Comparable> ArrayList<T> mergeSort(ArrayList<T> ar) { if (ar.size() == 1) return ar; else { int splitPoint = ar.size() / 2; ArrayList<T> split1 = mergeSort(splitArrayList(ar, 0, ar.size() / 2)); ArrayList<T> split2 = mergeSort(splitArrayList(ar, ar.size() / 2, ar.size())); ar = merge(split1, split2); } return ar; } public static <T extends Comparable> ArrayList<T> bubbleSort(ArrayList<T> ar) { boolean isSorted = false; while (!isSorted) { isSorted = true; for (int i = 0; i < ar.size() - 1; i++) { if (ar.get(i).compareTo(ar.get(i + 1)) > 1) { T holdValue = ar.get(i); ar.set(i, ar.get(i + 1)); ar.set(i + 1, holdValue); isSorted = false; } } } return ar; } public static void main(String[] args) { ArrayList<Double> test = generateRandomData(100000); double t1 = System.currentTimeMillis(); mergeSort(test); double t2 = System.currentTimeMillis(); test = generateRandomData(100000); double t3 = System.currentTimeMillis(); bubbleSort(test); double t4 = System.currentTimeMillis(); System.out.println("Merge sort " + (t2-t1) + " Bubble Sort " + (t4-t3)); } public static ArrayList<Double> generateRandomData(int size){ ArrayList<Double> toReturn = new ArrayList<>(); for (int i = 0; i < size; i++) { toReturn.add(Math.random()); } return toReturn; } } ,您将无法(直接)找到任何可能有助于解释您的得分值提问的结果,因此我们可以将此术语视为&#34;噪音&#34;达到你的期望。但是,如果您搜索术语Oracle,您会在第一个谷歌搜索结果中找到答案。

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