Разница в критериях поиска между Like и Contains () в Oracle - PullRequest
8 голосов
/ 18 апреля 2011

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

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

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

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

Ответы [ 2 ]

25 голосов
/ 18 апреля 2011

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

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

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

3 голосов
/ 18 апреля 2011

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

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

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

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

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