Apa namanya saat Anda mencari di tengah-tengah sebuah string, bukannya awal?

19

Saya mencoba memoles kosakata saya untuk berkomunikasi lebih baik dengan sesama pengembang. Kami memiliki beberapa tempat di situs tempat kami berdebat jika kami harus mencari string dari awal 'running%'vs di mana pun di string'%running% .

Saya telah memanggil pencarian tengah "fuzzy" yang saya sadari salah karena fuzzy berarti mengubah bentuk kata "run", "runing" [sic], "runed" [sic].

Apa terminologi yang benar untuk mencari awal string dan mencari tengah string?

danielson317
sumber
1
Saya telah bekerja di tempat-tempat yang menggunakan "Dimulai dengan" vs "Berisi" untuk membedakan antara dua opsi tersebut.
Solomon Rutzky

Jawaban:

24

Ini disebut "pola pencarian tidak berlabuh" , dan sepertinya ini di SQL.

foo LIKE '%bar%'

Jika Anda tidak memiliki %di kedua sisi, dikatakan bahwa pola pencarian masing-masing jangkar ke awal atau akhir string. Kata ini berasal dari dunia regex.

foo LIKE 'bar%'

Anda akan mengatakan, "pola pencarian bar%berlabuh ke awal string ".

Sebagai perbandingan, PCRE berlabuh dengan ^atau $token dan sepertinya ^baratau bar$. PCRE membutuhkan penahan eksplisit dengan token, sedangkan LIKEpernyataan SQL secara implisit berlabuh dan membutuhkan eksplisit %untuk membuat "pola pencarian tidak berlabuh" .

Sebagai catatan tambahan, Anda dapat mengindeks jenis ekspresi ini dengan trigram menggunakan sesuatu seperti pg_trgmdi PostgreSQL

Evan Carroll
sumber
1

Hal pertama yang terlintas dalam pikiran saya adalah "tidak dapat ditawar ". Mencari string tertentu, atau bagian pertama dari string, dalam bidang yang diindeks memungkinkan Anda untuk mencari. Jika pencarian Anda dimulai dengan wildcard, RDBMS harus memindai seluruh indeks, karena nilai-nilai yang memenuhi predikat pencarian Anda dapat muncul di mana saja di set nilai.

Pertimbangkan mencari di buku telepon (jika Anda cukup tua untuk mengingatnya ...). Anda dapat dengan mudah menemukan orang-orang yang nama belakangnya dimulai dengan "Dan:" Anda melihat-lihat Ds, beralih ke DA, dan DAN-sesuatu akan bersama-sama. Jika Anda ingin menemukan orang yang nama belakangnya menyertakan string "ANIEL," Anda harus membaca setiap halaman (pindai tabel).

Jon dari Semua Perdagangan
sumber
2
"RDBMS harus memindai seluruh indeks" itu tidak benar. postgresql.org/docs/9.6/static/pgtrgm.html
Evan Carroll
Saya pikir unsargable mungkin istilah yang lebih umum daripada yang dicari di sini karena mencakup sejumlah kasus lain (misalnya, mencari hasil dari fungsi yang dilakukan pada kolom).
David Spillett
0

Ini sebenarnya bukan pertanyaan Anda, tetapi contoh fuzzy Anda tidak tepat.

  • Fuzzy adalah kebalikan dari tajam, biner , yang berarti Anda dapat memiliki persentase kecocokan, misalnya pencarian fuzzy 'run'pada presisi .5 akan mencakup 'ran', 'rud', dan banyak kata lain. SQL tidak mendukung pencarian fuzzy, Anda memerlukan sistem tambahan seperti Lucene.
  • Sebuah wildcard mencari kehendak untuk 'run%'akan selalu menyertakan 'runing' dan 'runed', dan Anda dapat membedakan dimulai dengan dan mengandung ( '%run%'untuk memasukkan 'kehabisan') sebagai @ Solomon Rutzky menyarankan
  • Namun, jika Anda ingin menemukan seluruh kata , misalnya dalam blok teks, Anda perlu menunjukkan spasi putih sebelumnya atau trailing ' run '(atau ' run% 'untuk memasukkan kecocokan sebagian seperti 'bla bla runing bla' dan 'bla runed bla bla').
Damian Vogel
sumber