Какое значение имеет функция «СОДЕРЖАТЬ» в Oracle? - PullRequest
1 голос
/ 03 июля 2019
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 Ответ

2 голосов
/ 03 июля 2019

Содержит текстовый оператор Oracle.Документация (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, CONTОператор AINS должен ссылаться на значение метки счета в третьем параметре


Я думаю, что вы перепутали с числами, написанными как SCORE, так и CONTAINS - они должны совпадать.Думайте о них, как будто они были "этикетками"

Более "сложный" пример может быть таким:

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); Приятного чтения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...