Как это называется, когда вы ищете середину строки вместо начала?

19

Я пытаюсь пополнить свой словарный запас, чтобы лучше общаться с коллегами-разработчиками. У нас есть несколько мест на сайте, где мы обсуждаем, нужно ли искать строку с начала и 'running%'против где-либо в строке '%running%.

Я называю средний поиск «нечетким», который, как я понимаю, неверен, поскольку нечеткий означает изменение формы слова «беги», «беги» [sic], «беги» [sic].

Какова правильная терминология для поиска в начале строки и поиска в середине строки?

danielson317
источник
1
Я работал в местах, которые использовали «Начинается с» против «Содержит», чтобы различать эти два варианта.
Соломон Руцкий

Ответы:

24

Это называется «шаблон поиска без привязки» и выглядит так в SQL.

foo LIKE '%bar%'

Если вам не хватает ни %одной из сторон, говорят, что шаблон поиска привязывает к началу или концу строки соответственно. Этот жаргон встречается в мире регулярных выражений.

foo LIKE 'bar%'

Вы бы сказали, «шаблон поискаbar% привязан к началу строки ».

Для сравнения, PCRE привязан токенами ^или $токенами и выглядит как ^barили bar$. PCRE требуют явной привязки с токенами, тогда как операторы SQL LIKEнеявно привязаны и требуют явного %создания «не привязанного шаблона поиска» .

Как примечание, вы можете индексировать эти типы выражений с помощью триграмм, используя что-то вроде pg_trgmPostgreSQL

Эван Кэрролл
источник
1

Первое, что приходит мне в голову, - это ». Поиск определенной строки или первой части строки в индексированном поле позволяет выполнять поиск. Если ваш поиск начинается с подстановочного знака, СУБД придется сканировать весь индекс, потому что значения, соответствующие вашему предикату поиска, могут появляться в любом месте набора значений.

Подумайте о том, чтобы заглянуть в телефонную книгу (если вы достаточно взрослые, чтобы помнить это ...). Вы можете легко найти людей, чьи фамилии начинаются с «Дэн»: вы нажимаете на «Д», переворачиваете на «ДА», и ДАН-что-то будет все вместе. Если вы хотите найти людей, фамилии которых включают в себя строку «ANIEL», вам придется прочитать каждую страницу (отсканировать таблицу).

Джон на все руки
источник
2
«СУБД придется сканировать весь индекс», это не так. postgresql.org/docs/9.6/static/pgtrgm.html
Эван Кэрролл,
Я думаю, что unsargable может быть более общим термином, чем искомый здесь, поскольку он охватывает ряд других случаев (например, поиск результата функции, выполняемой над столбцом).
Дэвид
0

Это не совсем твой вопрос, но твой пример нечеткости неточен.

  • «Нечеткий» - это противоположность точного двоичного кода , то есть процент совпадений может быть, например, нечеткий поиск 'run'с точностью до .5 будет включать «run», «rud» и многие другие слова. SQL не поддерживает нечеткий поиск, вам нужны дополнительные системы, такие как Lucene.
  • WildCard поиск воли 'run%'всегда будет включать в себя «подножке» и «рунический», и вы можете отличить начинается и содержит ( '%run%'включить «опережающий») , как @ Соломон Rutzky предлагает
  • Однако, если вы хотите найти целые слова , например, в текстовых блоках, вам нужно будет указать предшествующий или завершающий пробел ' run '(или ' run% 'включить частичные совпадения, такие как «bla bla runing bla» и «bla runed bla bla»).
Дамиан Фогель
источник