- ไลบรารีอย่างง่ายสำหรับการทำ การค้นหาข้อความใน JavaScript โดยไม่ต้องมีดัชนี
- ใช้งานได้กับหลากหลายโปรเจ็กต์ และมีการจัดเรียงผลลัพธ์แบบอิง TF-IDF พร้อมประสิทธิภาพการค้นหาที่รวดเร็ว
- แม้จะไม่ได้มีฟีเจอร์มากเท่า FlexSearch หรือ lunr.js แต่ก็เร็วและมีประสิทธิภาพกว่าการใช้
text.indexOf(query) > -1 มาก
- มีประโยชน์สำหรับเว็บแอปพลิเคชันแบบเรียบง่ายที่จัดการกับชุดข้อมูลขนาดเล็ก
ฟีเจอร์หลัก
- ค้นหาโดยไม่ต้องมีดัชนี: ไม่ต้องมีขั้นตอนการสร้างดัชนีล่วงหน้าสำหรับการค้นหา
- รองรับตัวเลือกการค้นหาหลากหลาย:
- แยกตัวพิมพ์เล็ก-ใหญ่
- รองรับการค้นหาแบบคำ, แบบคำนำหน้า และแบบสไตล์ autocomplete
- ประสิทธิภาพรวดเร็ว: ค้นหารายการหลักพันรายการได้แบบเรียลไทม์
- มีการจัดอันดับแบบ TF-IDF: จัดเรียงผลการค้นหาตามลำดับที่ "เกี่ยวข้องมากที่สุด"
API
- ฟังก์ชัน
search รับอาร์กิวเมนต์บังคับ 2 ตัว และอาร์กิวเมนต์เลือกได้ 2 ตัว
items: รายการของสิ่งที่จะค้นหา โดยทั่วไปเป็นอาร์เรย์ของสตริง หรืออาร์เรย์ของอ็อบเจ็กต์ที่มีพร็อพเพอร์ตีเป็นสตริง
query: สตริงคำค้นที่จะใช้ค้นหา
by (เลือกได้): ฟังก์ชันที่คืนค่าสตริงจากรายการ ค่าปริยายคือ x => String(x)
options (เลือกได้): อ็อบเจ็กต์ที่รวมตัวเลือกการค้นหา
caseSensitive: จะให้แยกตัวพิมพ์เล็ก-ใหญ่หรือไม่ ค่าปริยายคือ false
mode: วิธีการจับคู่คำค้นที่ยังไม่สมบูรณ์
mode: 'word': จับคู่เฉพาะคำเต็มเท่านั้น
mode: 'prefix': จับคู่เป็นคำนำหน้าของคำ
mode: 'autocomplete': โหมดไฮบริดที่คำค้นคำสุดท้ายอาจยังไม่สมบูรณ์
ตัวอย่างการใช้งาน
import { search } from 'libsearch'; // สภาพแวดล้อม Node.js
const { search } = window.libsearch; // สภาพแวดล้อมเบราว์เซอร์
// การค้นหาพื้นฐาน
search(articles, 'berkeley cali', a => a.title);
// => [{ title: 'Weather in Berkeley, California' }]
// การค้นหาแบบระดับคำ: “California” จะค้นหาเฉพาะ “California”
search(articles, 'california', a => a.title, { mode: 'word' });
// การค้นหาแบบแยกตัวพิมพ์เล็ก-ใหญ่: ค้นหาด้วยตัวพิมพ์ใหญ่ “W”
search(articles, 'W', a => a.title, { caseSensitive: true });
// การจัดการคำค้นว่าง: คืนผลลัพธ์ทั้งหมด
search(articles, '', a => a.title);
วิธีการค้นหา
- libsearch ทำการค้นหาข้อความแบบเต็มอย่างรวดเร็วในรายการอ็อบเจ็กต์ JavaScript โดยไม่ต้องมีดัชนีค้นหาที่สร้างไว้ล่วงหน้า
-
- แปลงคำค้นเป็น regular expression
- ใช้ประโยชน์จากเอนจิน regular expression ที่ได้รับการปรับแต่งอย่างดีใน JavaScript สมัยใหม่ โดยแปลงสตริงคำค้นให้เป็นตัวกรอง regular expression เพื่อทำการค้นหา
- ตัวอย่าง: “Uni of California” → (^|\W)Uni($|\W), (^|\W)of($|\W), (^|\W)California
-
- คำนวณการจัดอันดับแบบ TF-IDF โดยอิงจากการจับคู่ด้วย regular expression และความยาวของเอกสาร
- ใช้ความยาวของเอกสาร (จำนวนอักขระ) เพื่อประมาณค่า TF-IDF แทนการใช้จำนวนคำในเอกสาร
3 ความคิดเห็น
แต่ก็มีประเด็นอยู่ข้อหนึ่งนะ..
ฉันสนใจเลยลองเข้าไปดู แต่ดูเหมือนว่าไม่ได้มีการบำรุงรักษามา 3 ปีแล้ว... หรือว่าตัวไลบรารีสมบูรณ์แบบจนไม่ต้องดูแลรักษาเลยจริง ๆ กันนะ...? ก็เลยอดสงสัยไม่ได้
ความคิดเห็นจาก Hacker News
TypeScript 115 บรรทัดถือว่าเบา แต่ก็อาจขาดฟีเจอร์สำคัญ
ทำให้ตระหนักว่าการทำฟีเจอร์ค้นหานั้นทำได้ง่าย
มักใช้ Fuse ในแอป JavaScript
หากใช้เครื่องมืออย่าง FlexSearch หรือ lunr การสร้างดัชนีสำหรับรายการนับพันรายการก็ทำได้เร็วมาก
ตั้งคำถามว่าข้อดีของการไม่มีดัชนีคืออะไร