我有这个问题:
SELECT last_name, SCORE(1)
FROM Employees
WHERE CONTAINS(last_name, '%sul%', 1) > 0
它产生以下输出:
问题是:
为什么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行。
有人可以解释一下第三个参数是什么?
提前致谢:)
答案 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已经给了他们一个很好的答案。