brief: | ขณะนี้ i18n.site รองรับการค้นหาข้อความแบบเต็มแบบไร้เซิร์ฟเวอร์

บทความนี้แนะนำการใช้งานเทคโนโลยีการค้นหาข้อความแบบเต็มส่วนหน้า รวมถึงดัชนีกลับด้านที่สร้างโดย IndexedDB การค้นหาคำนำหน้า การเพิ่มประสิทธิภาพการแบ่งส่วนคำ และการสนับสนุนหลายภาษา

เมื่อเปรียบเทียบกับโซลูชันที่มีอยู่แล้ว การค้นหาข้อความแบบเต็มส่วนหน้าของ i18n.site มีขนาดเล็กและรวดเร็ว เหมาะสำหรับเว็บไซต์ขนาดเล็กและขนาดกลาง เช่น เอกสารและบล็อก และพร้อมใช้งานแบบออฟไลน์


การค้นหาข้อความแบบเต็มแบบกลับด้านส่วนหน้าล้วนๆ

ลำดับ

หลังจากหลายสัปดาห์ของการพัฒนา i18n.site (เครื่องมือสร้างเว็บไซต์ markdown multilingualtranslation & แบบคงที่ล้วนๆ) รองรับการค้นหาข้อความแบบเต็มส่วนหน้าอย่างแท้จริง

บทความนี้จะแบ่งปันการใช้งานทางเทคนิคของการค้นหาข้อความแบบเต็มส่วนหน้า i18n.site เพื่อ i18n.site ประสบการณ์การค้นหา

รหัสโอเพ่นซอร์ส : ค้นหาเคอร์เนล / อินเทอร์เฟซแบบโต้ตอบ

ภาพรวมของโซลูชันการค้นหาข้อความแบบเต็มแบบไร้เซิร์ฟเวอร์

สำหรับเว็บไซต์ขนาดเล็กและขนาดกลางแบบคงที่ล้วนๆ เช่น เอกสาร/บล็อกส่วนตัว การสร้างแบ็กเอนด์การค้นหาข้อความแบบเต็มที่สร้างขึ้นเองนั้นหนักเกินไป และการค้นหาข้อความแบบเต็มแบบไร้บริการเป็นตัวเลือกที่พบบ่อยกว่า

โซลูชันการค้นหาข้อความแบบเต็มแบบไร้เซิร์ฟเวอร์แบ่งออกเป็นสองประเภทกว้างๆ:

ประการ algolia.com ผู้ให้บริการการค้นหาบุคคลที่สามที่คล้ายกันจะจัดเตรียมส่วนประกอบส่วนหน้าสำหรับการค้นหาข้อความแบบเต็ม

บริการดังกล่าวจำเป็นต้องชำระเงินตามปริมาณการค้นหา และมักไม่มีให้บริการสำหรับผู้ใช้ในจีนแผ่นดินใหญ่เนื่องจากปัญหาต่างๆ เช่น การปฏิบัติตามข้อกำหนดของเว็บไซต์

ไม่สามารถใช้แบบออฟไลน์ ไม่สามารถใช้บนอินทราเน็ต และมีข้อจำกัดอย่างมาก บทความนี้ไม่ได้กล่าวถึงมากนัก

ประการที่สองคือการค้นหาข้อความแบบเต็มส่วนหน้าล้วนๆ

ในปัจจุบัน การค้นหาข้อความแบบเต็มส่วนหน้าทั่วไปประกอบด้วย lunrjs และ ElasticLunr.js (ขึ้นอยู่กับการพัฒนารอง lunrjs )

lunrjs มีสองวิธีในการสร้างดัชนี และทั้งสองวิธีก็มีปัญหาของตัวเอง

  1. ไฟล์ดัชนีที่สร้างไว้ล่วงหน้า

    เนื่องจากดัชนีประกอบด้วยคำจากเอกสารทั้งหมด จึงมีขนาดใหญ่ เมื่อใดก็ตามที่มีการเพิ่มหรือแก้ไขเอกสาร จะต้องโหลดไฟล์ดัชนีใหม่ จะทำให้ผู้ใช้ใช้เวลารอนานขึ้นและใช้แบนด์วิธเป็นจำนวนมาก

  2. โหลดเอกสารและสร้างดัชนีได้ทันที

    การสร้างดัชนีเป็นงานที่ต้องใช้การคำนวณสูง การสร้างดัชนีใหม่ทุกครั้งที่คุณเข้าถึงจะทำให้เกิดความล่าช้าอย่างเห็นได้ชัดและประสบการณ์การใช้งานที่ไม่ดี


นอกจาก lunrjs แล้ว ยังมีโซลูชันการค้นหาข้อความแบบเต็มอื่นๆ เช่น :

fusejs คำนวณความคล้ายคลึงกันระหว่างสตริงที่จะค้นหา

ประสิทธิภาพของโซลูชันนี้แย่มาก และไม่สามารถใช้สำหรับการค้นหาข้อความแบบเต็มได้ (ดู Fuse.js การสืบค้นแบบยาวใช้เวลานานกว่า 10 วินาที จะปรับให้เหมาะสมได้อย่างไร )

TinySearch ให้ใช้ตัวกรอง Bloom เพื่อค้นหา ไม่สามารถใช้สำหรับการค้นหาคำนำหน้าได้ (เช่น ป้อน goo ค้นหา good , google ) และไม่สามารถใช้เอฟเฟกต์การเติมคำอัตโนมัติที่คล้ายกันได้

เนื่องจากข้อบกพร่องของโซลูชันที่มีอยู่ i18n.site จึงพัฒนาโซลูชันการค้นหาข้อความแบบเต็มส่วนหน้าแบบใหม่ซึ่งมีลักษณะดังต่อไปนี้ :

  1. รองรับการค้นหาหลายภาษาและมีขนาดเล็ก ขนาดของเคอร์เนลการค้นหาหลังแพ็กเกจ gzip คือ 6.9KB (สำหรับการเปรียบเทียบ ขนาดของ lunrjs คือ 25KB )
  2. สร้างดัชนีกลับหัวโดยยึดตาม indexedb ซึ่งใช้หน่วยความจำน้อยลงและรวดเร็ว
  3. เมื่อมีการเพิ่ม/แก้ไขเอกสาร เฉพาะเอกสารที่เพิ่มหรือแก้ไขเท่านั้นที่จะถูกจัดทำดัชนีใหม่ ซึ่งช่วยลดปริมาณการคำนวณ
  4. รองรับการค้นหาคำนำหน้าซึ่งสามารถแสดงผลการค้นหาแบบเรียลไทม์ในขณะที่ผู้ใช้พิมพ์
  5. มีจำหน่ายแบบออฟไลน์

ด้านล่างนี้ จะมีการแนะนำรายละเอียดการใช้งานด้านเทคนิค i18n.site

การแบ่งส่วนคำหลายภาษา

การแบ่งส่วนคำใช้การแบ่งส่วนคำดั้งเดิมของเบราว์เซอร์ Intl.Segmenter และเบราว์เซอร์กระแสหลักทั้งหมดรองรับอินเทอร์เฟซนี้

รหัสการแบ่งส่วนคำ coffeescript มีดังนี้

SEG = new Intl.Segmenter 0, granularity: "word"

seg = (txt) =>
  r = []
  for {segment} from SEG.segment(txt)
    for i from segment.split('.')
      i = i.trim()
      if i and !'|`'.includes(i) and !/\p{P}/u.test(i)
        r.push i
  r

export default seg

export segqy = (q) =>
  seg q.toLocaleLowerCase()

ใน: