Разница в критериях поиска между 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" в строке.