Разница в критериях поиска между Like и Contains() в Oracle

Я создал таблицу с двумя столбцами. Я вставил две строки.

id     name
1      narsi reddy
2      narei sia

один - просто числовой тип, а другой - тип CLOB. Поэтому я решил использовать индексирование для этого. Я спросил об этом с помощью содержит. запрос:

select * from emp where contains(name,'%a%e%')>0

2      narei sia

Я ожидал, что 2 придут, но нет. Но если я даю то же самое, как если бы я получил то, что хотел. запрос:

select * from emp where name like '%a%e%'

ID                     NAME                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
1                      (CLOB) narsi reddy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
2                      (CLOB) narei sia                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

2 rows selected

наконец, я понял, что вроде ищет весь документ или параграф, но содержит ищет в словах.

так как я могу получить требуемый вывод?

2 ответа

LIKE и CONTAINS - это принципиально разные методы поиска.

LIKE - это очень простое средство сопоставления строковых шаблонов - оно распознает два подстановочных знака (%) и (_), которые соответствуют нулю или более или точно одному символу соответственно. В вашем случае%a%e% соответствует двум записям в вашей таблице - он ищет ноль или более символов, за которыми следует aза которым следует ноль или более символов, за которыми следует e, за которым следует ноль или более символов. Он также очень упрощен в своем возвращаемом значении: он возвращает либо "совпавший", либо "несоответствующий" - без оттенков серого.

CONTAINS - это мощный инструмент поиска, использующий контекстный индекс, который создает некое подобие дерева слов, в котором можно искать с использованием синтаксиса поиска CONTAINS. Он может использоваться для поиска одного слова, комбинации слов и имеет собственный собственный богатый синтаксис, такой как логические операторы (AND, NEAR, ACCUM). Он также более силен в том, что вместо возврата простого "совпавшего" или "несоответствующего" он возвращает "счет", который можно использовать для ранжирования результатов в порядке релевантности; например, CONTAINS(col, "собака NEAR кошка") вернет более высокий балл за документ, где оба эти слова находятся близко друг к другу.

Я считаю, что ваш CONTAINS запрос соответствует 'narei sia', потому что шаблон '% a% e%' соответствует слову 'narei'. Это не соответствует "narsi reddy", потому что ни одно слово, взятое отдельно, не соответствует шаблону.

Я полагаю, вы хотите использовать CONTAINS вместо LIKE по причинам производительности. Я ни в коем случае не эксперт по CONTAINS выражения запроса, но я не вижу простого способа выполнить именно тот поиск, который вам нужен, поскольку вы ищете буквы, которые могут быть в одном и том же слове или в разных словах, но должны встречаться в заданном порядке. Я думаю, что может быть лучше сделать комбинацию из двух методов:

WHERE CONTAINS(name,'%a% AND %e%') > 0
  AND name LIKE '%a%e%'

Я думаю, что это позволило бы использовать текстовый индекс для поиска подходящих кандидатов (все, что имеет хотя бы одно слово, содержащее "а", и хотя бы одно слово, содержащее "е"). Затем они будут отфильтрованы LIKE условие, обеспечивающее выполнение требования "a" предшествовать "e" в строке.

Другие вопросы по тегам