Як це називається, коли ви шукаєте середину рядка замість початку?


19

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

Я називав середній пошук "нечітким", який я розумію, що невірно, оскільки нечіткий означає зміну форми слова "бігти", "бігати" [sic], "runed" [sic].

Яка правильна термінологія для пошуку початку рядка та пошуку середини рядка?


1
Я працював у місцях, де для розмежування цих двох варіантів використовувався параметр "Починається з" проти "Містить".
Соломон Руцький

Відповіді:


24

Це називається "незакріплений шаблон пошуку" , і він виглядає приблизно так у SQL.

foo LIKE '%bar%'

Якщо вам не вистачає символу %з обох сторін, кажуть, що шаблон пошуку прив’язується до початку або кінця рядка відповідно. Цей лінго походить із світу виразів.

foo LIKE 'bar%'

Ви б сказали, "шаблон пошуку, bar%прикріплений до початку рядка ".

Для порівняння, PCRE приєднаний до ^або $лексем, і він виглядає як ^barабо bar$. PCRE вимагають явного прив’язки до лексем, тоді як оператори SQL LIKEнеявно закріплені та вимагають явного %створення "несанкціонованого пошуку" .

Як бічну примітку, ви можете індексувати ці типи виразів триграмами, використовуючи щось на зразок pg_trgmPostgreSQL


1

Перше, що мені спадає на думку, - це " незбагненність ". Пошук певного рядка або першої частини рядка в індексованому полі дозволяє шукати. Якщо ваш пошук починається з підстановки, RDBMS доведеться сканувати весь індекс, оскільки значення, які відповідають вашому пошуковому предикату, можуть з’являтися в будь-якому місці набору значень.

Подумайте про те, щоб заглянути в телефонну книгу (якщо ви досить дорослі, щоб запам'ятати ці ...). Ви можете легко знайти людей, прізвища яких починаються з "Ден": ви клацніть пальцем до Ds, перевернетесь вперед до DA, і DAN-що-небудь буде разом. Якщо ви хочете знайти людей, прізвища яких включають рядок "ANIEL", вам доведеться читати кожну сторінку (скануйте таблицю).


2
"RDBMS доведеться сканувати весь індекс", це не відповідає дійсності. postgresql.org/docs/9.6/static/pgtrgm.html
Еван Керролл

Я думаю, що нестандартний термін може бути більш загальним терміном, ніж тут шукають, оскільки він охоплює ряд інших випадків (наприклад, пошук результату функції, що виконується на стовпчику).
Девід Спіллетт

0

Це насправді не ваше запитання, але ваш приклад нечіткого - неточний.

  • Нечітке - це протилежність різкого, бінарного , це означає, що ви можете мати відсоток відповідності, наприклад, нечіткий пошук з 'run'точністю .5 буде включати "побіг", "руд" та багато інших слів. SQL не підтримує нечіткий пошук, потрібні додаткові системи на зразок Lucene.
  • WildCard пошук волі 'run%'завжди буде включати в себе «підніжці» і «рунічний», і ви можете відрізнити починається і містить ( '%run%'включити «випереджаюче») , як @ Соломон Rutzky пропонує
  • Однак якщо ви хочете знайти цілі слова , наприклад, в текстових блоках, вам потрібно буде вказати попередній або пробільний пробіл ' run '(або ' run% 'включити часткові збіги, такі як "bla bla runing bla" і "bla runed bla bla").
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.