oracle中“ CONTAIN”功能的意义是什么?

时间:2019-07-03 10:41:22

标签: sql oracle full-text-search

CREATE TABLE accumtbl 
   (id NUMBER, text VARCHAR2(4000) )

INSERT INTO accumtbl VALUES 
   ( 1, 'the little dog played with the big dog 
      while the other dog ate the dog food');
INSERT INTO accumtbl values 
   (2, 'the cat played with the dog');

CREATE INDEX 
   accumtbl_idx ON accumtbl (text) 
  indextype is ctxsys.context 

SELECT 
   SCORE(1) 
FROM 
   accumtbl 
WHERE 
   CONTAINS (text, 'dog accum Cat', 1) > 0;

输出:

SCORE(1)
6
52

如何?

我尝试使用不同的值,但无法理解参数的含义以及如何计算分数

SELECT 
   SCORE(1) 
FROM 
   accumtbl 
WHERE 
   CONTAINS (text, 'dog accum Cat', 1) > 0;

输出:

SCORE(1)
6
52

输出:

SCORE(1)
6
52

1 个答案:

答案 0 :(得分:2)

包含Oracle Text运算符。文档(https://docs.oracle.com/database/121/CCAPP/GUID-13F9B749-125B-40FD-9AFD-A636597447D0.htm#CCAPP9136)说:

  

创建类型为CONTEXT的索引时,必须使用CONTAINS运算符输入查询。类型为CONTEXT的索引适合于索引大型连贯文档。

     

使用CONTAINS运算符,您可以使用许多运算符来定义搜索条件。这些运算符使您可以输入逻辑,邻近,模糊,词干,词库和通配符搜索。使用正确配置的索引,您还可以在具有内部结构(例如HTML和XML)的文档上输入节搜索。

     

使用CONTAINS,您还可以使用ABOUT运算符搜索文档主题。

此外:

  

CONTAINS运算符必须始终跟随> 0语法,该语法指定CONTAINS运算符返回的得分值必须大于零才能返回行。

     

在SELECT语句中调用SCORE运算符时,CONTAINS运算符必须在第三个参数中引用得分标签值


我认为您对以SCORECONTAINS书写的数字感到困惑-它们应该匹配。将它们视为“标签”。

一个更“复杂”的例子可能是这样:

SQL> SELECT SCORE (1) sc1,
  2         SCORE (2) sc2
  3    FROM accumtbl
  4   WHERE    CONTAINS (text, 'dog accum Cat', 1) > 0        --> this "1" comes from "score (1)"
  5         OR CONTAINS (text, 'little dog'   , 2) > 0        --> this "2" comes from "score (2)"
  6  ;

       SC1        SC2
---------- ----------
         6          4
        52          0

SQL>

您说:

  

我尝试使用不同的值...(但总是得到相同的结果)

你当然做到了;所有这些都将返回相同的结果:

select score(1)    ... contains (text, 'something', 1)
select score(100)  ... contains (text, 'something', 100)
select score(57)   ... contains (text, 'something', 57)
select score(-261) ... contains (text, 'something', -261)

关于Oracle Text的内容很多。这是目录(https://docs.oracle.com/database/121/CCAPP/toc.htm);阅读愉快!