มันเรียกว่าอะไรเมื่อคุณค้นหาตรงกลางของสตริงแทนที่จะเป็นจุดเริ่มต้น


19

ฉันพยายามขัดคำศัพท์ของฉันเพื่อสื่อสารกับนักพัฒนาเพื่อนของฉันให้ดีขึ้น เรามีสถานที่หลายแห่งในเว็บไซต์ที่เรากำลังถกเถียงกันว่าเราควรค้นหาสตริงจากจุดเริ่มต้น'running%'เทียบกับตำแหน่งใด ๆ ในสตริง'%running%เทียบกับที่ใดก็ได้ในสตริง

ฉันเรียกการค้นหากึ่งกลางว่า "ฟัสซี"ซึ่งฉันรู้ว่าไม่ถูกต้องเนื่องจากฟัซซี่หมายถึงการเปลี่ยนรูปแบบของคำว่า "รัน", "รัน" [sic], "รัน" [sic]

คำศัพท์ที่ถูกต้องสำหรับการค้นหาจุดเริ่มต้นของสตริงและค้นหาตรงกลางของสตริงคืออะไร?


1
ฉันได้ทำงานในสถานที่ที่ใช้ "เริ่มต้นด้วย" vs "มี" เพื่อแยกความแตกต่างระหว่างสองตัวเลือกเหล่านั้น
โซโลมอน Rutzky

คำตอบ:


24

มันเรียกว่า"รูปแบบการค้นหาที่ไม่ได้ยึด"และดูเหมือนว่านี่ใน SQL

foo LIKE '%bar%'

หากคุณขาด%ด้านใดด้านหนึ่งจะกล่าวว่ารูปแบบการค้นหาจุดยึดที่จุดเริ่มต้นหรือจุดสิ้นสุดของสตริงตามลำดับ ศัพท์แสงนี้มาจากโลก regex

foo LIKE 'bar%'

คุณจะพูดว่า"รูปแบบการค้นหาที่bar%ยึดไว้กับจุดเริ่มต้นของสตริง "

สำหรับการเปรียบเทียบเป็น PCRE ทอดสมออยู่ด้วย^หรือ$ราชสกุลและดูเหมือนว่าหรือ^bar bar$PCREs ต้องยึดอย่างชัดเจนพร้อมด้วยสัญญาณในขณะที่ SQL LIKEงบทอดสมอโดยปริยายและต้องชัดเจน%ในการสร้าง"รูปแบบการค้นหายกเลิกการยึด"

ในฐานะที่เป็นหมายเหตุด้านข้างคุณสามารถจัดทำดัชนีประเภทของนิพจน์เหล่านี้ด้วย trigrams โดยใช้บางอย่างpg_trgmใน PostgreSQL


1

สิ่งแรกที่อยู่ในใจของฉันคือ "ไม่สามารถโต้แย้งได้ได้" การค้นหาสตริงที่เฉพาะเจาะจงหรือส่วนแรกของสตริงในเขตข้อมูลที่จัดทำดัชนีช่วยให้คุณค้นหา หากการค้นหาของคุณเริ่มต้นด้วยอักขระตัวแทน RDBMS จะต้องสแกนดัชนีทั้งหมดเนื่องจากค่าที่ตรงกับภาคการค้นหาของคุณอาจปรากฏที่ใดก็ได้ในชุดของค่า

ลองพิจารณาดูในสมุดโทรศัพท์ (ถ้าคุณอายุมากพอที่จะจดจำสิ่งเหล่านั้น ... ) คุณสามารถค้นหาคนที่มีนามสกุลขึ้นต้นด้วย "Dan:" คุณนิ้วหัวแม่มือไปที่ Ds พลิกไปที่ DAs และ DAN-somethings จะอยู่ด้วยกัน หากคุณต้องการค้นหาคนที่มีนามสกุลรวมสตริง "ANIEL" คุณจะต้องอ่านทุกหน้า (สแกนตาราง)


2
"RDBMS จะต้องสแกนดัชนีทั้งหมด" ซึ่งไม่เป็นความจริง postgresql.org/docs/9.6/static/pgtrgm.html
Evan Carroll

ฉันคิดว่าไม่สามารถโต้แย้งได้อาจเป็นคำทั่วไปมากกว่าที่จะถูกค้นหาที่นี่เนื่องจากครอบคลุมหลายกรณีอื่น ๆ (เช่นการค้นหาผลลัพธ์ของฟังก์ชันที่ดำเนินการในคอลัมน์เป็นต้น)
David Spillett

0

มันไม่ใช่คำถามของคุณ แต่ตัวอย่างของความคลุมเครือนั้นไม่แน่ชัด

  • ฟัซซี่อยู่ตรงข้ามกับเลขฐานสองที่คมชัดซึ่งหมายความว่าคุณสามารถมีเปอร์เซ็นต์ของการจับคู่ได้เช่นการค้นหาแบบฟัซซี'run'ที่ความแม่นยำ 0.5 จะประกอบด้วย 'ran', 'rud' และคำอื่น ๆ อีกมากมาย SQL ไม่รองรับการค้นหาแบบคลุมเครือคุณต้องมีระบบเพิ่มเติมเช่น Lucene
  • การค้นหาไวด์การ์ดจะ'run%'รวมอยู่ใน 'runing' และ 'runed' เสมอและคุณสามารถแยกความแตกต่างของการเริ่มต้นด้วยและมี ( '%run%'เพื่อรวม 'outrunning') เป็น @ Solomon Rutzkyแนะนำ
  • อย่างไรก็ตามหากคุณต้องการค้นหาทั้งคำเช่นในบล็อคข้อความคุณจะต้องระบุช่องว่างก่อนหน้าหรือตามหลัง' run '(หรือ' run% 'รวมการจับคู่บางส่วนเช่น 'bla bla runing bla' และ 'bla runed bla bla')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.