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

#sql #oracle

#sql #Oracle

Вопрос:

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

 id     name
1      narsi reddy
2      narei sia
  

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

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

2      narei sia
  

Я ожидал, что придет 2, но нет. Но если я даю то же самое с помощью like, это дает то, что я хотел.
запрос:

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

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

2 rows selected
  

наконец, я понял, что like выполняет поиск по всему документу или абзацу, а contains ищет по словам.

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

Ответ №1:

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

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

CONTAINS — это мощный инструмент поиска, который использует контекстный индекс, который строит своего рода дерево слов, в котором можно выполнять поиск с использованием синтаксиса поиска CONTAINS. Он может использоваться для поиска одного слова, комбинации слов и имеет собственный богатый синтаксис, такой как логические операторы (И, РЯДОМ, ACCUM). Он также более эффективен в том смысле, что вместо простого «соответствует» или «не соответствует» он возвращает «оценку», которую можно использовать для ранжирования результатов в порядке релевантности; например, CONTAINS(col, ‘dog NEAR cat’) вернет более высокую оценку для документа, где эти два слова находятся близко друг к другу.

Комментарии:

1. Это означает, что contains не может выполнять поиск как LIKE делают . Предположим, у меня есть строка person name is himans . Если я выполню поиск по contains for ers , я получу пустое значение?

2. Если вы просто хотите определить ers в строке, используйте like или instr .

Ответ №2:

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

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

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

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