12 คะแนน โดย GN⁺ 2024-12-30 | 3 ความคิดเห็น | แชร์ทาง WhatsApp
  • ไลบรารีอย่างง่ายสำหรับการทำ การค้นหาข้อความใน 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 โดยไม่ต้องมีดัชนีค้นหาที่สร้างไว้ล่วงหน้า
    1. แปลงคำค้นเป็น regular expression
    • ใช้ประโยชน์จากเอนจิน regular expression ที่ได้รับการปรับแต่งอย่างดีใน JavaScript สมัยใหม่ โดยแปลงสตริงคำค้นให้เป็นตัวกรอง regular expression เพื่อทำการค้นหา
    • ตัวอย่าง: “Uni of California” → (^|\W)Uni($|\W), (^|\W)of($|\W), (^|\W)California
    1. คำนวณการจัดอันดับแบบ TF-IDF โดยอิงจากการจับคู่ด้วย regular expression และความยาวของเอกสาร
    • ใช้ความยาวของเอกสาร (จำนวนอักขระ) เพื่อประมาณค่า TF-IDF แทนการใช้จำนวนคำในเอกสาร

3 ความคิดเห็น

 
yangeok 2025-01-06

แต่ก็มีประเด็นอยู่ข้อหนึ่งนะ..

 
beenzinozino 2025-01-04

ฉันสนใจเลยลองเข้าไปดู แต่ดูเหมือนว่าไม่ได้มีการบำรุงรักษามา 3 ปีแล้ว... หรือว่าตัวไลบรารีสมบูรณ์แบบจนไม่ต้องดูแลรักษาเลยจริง ๆ กันนะ...? ก็เลยอดสงสัยไม่ได้

 
GN⁺ 2024-12-30
ความคิดเห็นจาก Hacker News
  • TypeScript 115 บรรทัดถือว่าเบา แต่ก็อาจขาดฟีเจอร์สำคัญ

    • มีลิงก์สำหรับเปรียบเทียบขนาด ชุดฟีเจอร์ และประสิทธิภาพของทางเลือก JavaScript แบบต่าง ๆ
    • แชร์ประสบการณ์ที่เคยเลือกใช้ uFuzzy เมื่อหลายปีก่อน
  • ทำให้ตระหนักว่าการทำฟีเจอร์ค้นหานั้นทำได้ง่าย

    • เป็นเอนจิน regular expression ที่ฉลาดมาก
    • ยังไม่ชัดเจนว่าจะจัดการการค้นหาแบบคลุมเครืออย่างไร (เช่น Califnia แทน California) แต่การทำความเข้าใจวิธีการนำไปใช้ก็น่าสนใจ
  • มักใช้ Fuse ในแอป JavaScript

    • รู้สึกหงุดหงิดที่การค้นหาในแอปจำนวนมากไม่สามารถรองรับคำพิมพ์ผิดได้
  • หากใช้เครื่องมืออย่าง FlexSearch หรือ lunr การสร้างดัชนีสำหรับรายการนับพันรายการก็ทำได้เร็วมาก

    • สามารถสร้างดัชนีตอนที่ผู้ใช้เปิดอินเทอร์เฟซการค้นหา และหลังใช้งานเสร็จก็ไม่ต้องสนใจมันอีก
  • ตั้งคำถามว่าข้อดีของการไม่มีดัชนีคืออะไร

    • ชอบโปรแกรมที่เล็กและเรียบง่าย
    • ดูคล้ายกับ grep