ข้ามไปยังเนื้อหา
Dee Wan 1.0 ยังอยู่ระหว่างพัฒนาและยังไม่เปิดตัว (pre-MVP) — ดู ขอบเขตผลิตภัณฑ์ 1.0

ค้นหาและถอนเนื้อหาอย่างปลอดภัย

API อ่านข้อมูลสาธารณะ ให้เนื้อหาที่เผยแพร่แล้ว ปลายทางรายการของ API ไม่ใช่ระบบค้นหาทั่วไป แต่มีปลายทางสำหรับค้นหาเนื้อหาปัจจุบันหนึ่งเส้นทาง คือ GET /v1/_search และคำแนะนำขณะผู้เข้าชมพิมพ์ คือ GET /v1/_search/suggest เว็บไซต์แบบ managed และเว็บไซต์ที่สร้างขึ้นใช้สิ่งนี้สร้างหน้าค้นหา อ่าน API จากเซิร์ฟเวอร์ ขณะบิลด์ หรือ Worker ได้โดยไม่ต้องตั้งค่า CORS แอปเบราว์เซอร์ที่อยู่คนละต้นทางอ่านได้หลังเพิ่มต้นทางใน การตั้งค่า → API → ต้นทางของเบราว์เซอร์ ดู การอนุญาตต้นทาง ห้ามใส่ร่างหรือเนื้อหาส่วนตัวในดัชนีสาธารณะที่ไม่ตรวจสิทธิ์

การตั้งค่าการค้นหาไซต์ขณะที่ปิดการค้นหาอยู่

เปิด การตั้งค่า → ซอร์สโค้ดและการเผยแพร่ → การค้นหาของไซต์ ต้องมีสิทธิ์ site:infra ติ๊ก เปิดการค้นหาของไซต์ แล้วบันทึก

การค้นหาครอบคลุมหน้าที่เผยแพร่เสมอ และบนไซต์บล็อกจะรวมโพสต์ที่เผยแพร่ด้วย ใต้ ค้นหาเพิ่มเติมใน ติ๊กประเภทเนื้อหาสาธารณะอื่นเพื่อเพิ่ม ได้สูงสุด 16 ประเภท ประเภทเนื้อหาส่วนตัวจะไม่ถูกเสนอและไม่ถูกค้นหา

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

  • ติ๊กฟิลด์ที่ใช้ค้นหาประเภทนั้น ได้สูงสุด 16 ฟิลด์ ฟิลด์ที่ไม่ได้ติ๊กจะไม่ถูกค้นหาสำหรับประเภทนั้น
  • ให้น้ำหนักแต่ละฟิลด์ตั้งแต่ 1 ถึง 10 ผลลัพธ์จัดอันดับตามน้ำหนักสูงสุดในบรรดาฟิลด์ที่ติ๊กซึ่งมีทุกคำ 10 มีน้ำหนักมากที่สุด
  • การปรับใหม่เริ่มที่ชื่อเรื่องเป็น 10 และฟิลด์ข้อความอื่นเป็น 1
  • ประเภทที่ไม่ได้ปรับใช้การจัดอันดับเริ่มต้น ชื่อเรื่องที่ตรงนับเป็น 10
  • เอาติ๊กประเภทออกเพื่อกลับไปใช้ค่าเริ่มต้น
  • ลำดับความสำคัญของการค้นหา ของรายการจะเลื่อนอันดับผลลัพธ์ที่เผยแพร่แล้วตั้งแต่ −10 ถึง 10 ค่า 0 คงอันดับตามปกติ ค่านี้ไม่ทำให้รายการที่ไม่ตรงคำค้นปรากฏ ต้องเผยแพร่รายการเพื่อใช้ค่าที่เปลี่ยน

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

การจัดอันดับบทความในการค้นหาและน้ำหนักฟิลด์ก่อนบันทึก

ประเภทเนื้อหาที่ค้นหาแต่ละประเภทมีตัวเลือก การจับคู่ ใน การจับคู่และการจัดอันดับ ทุกคำในคำค้นต้องตรงตามวิธีจับคู่ที่เลือก

การจับคู่ พบ ตัวอย่าง
ทั้งคำ (ค่าเริ่มต้น) เฉพาะคำเดียวกัน “tour” พบ “tour” แต่ไม่พบ “tours”
รูปคำภาษาอังกฤษ รูปอื่นของคำภาษาอังกฤษ “tour” พบ “tours” และ “touring” ด้วย
บางส่วนของคำ ตัวอักษรที่อยู่ตรงไหนก็ได้ในคำ “tour” พบ “tours” และ “detour” ด้วย
  • คำคือตัวอักษร เครื่องหมายกำกับ และตัวเลข เครื่องหมายกำกับคือเครื่องหมายเสริมที่ซ้อนบนตัวอักษร รวมถึงสระและวรรณยุกต์ของอักษรอย่างภาษาไทย จึงอยู่ภายในคำเดียวกัน อักขระอื่นทั้งหมดใช้แยกคำเท่านั้น: “don’t” คือคำ “don” และ “t”
  • ใส่เครื่องหมายคำพูดคู่รอบวลีเพื่อกำหนดให้คำอยู่ติดกันตามลำดับในฟิลด์เดียวกัน ระบบปฏิเสธเครื่องหมายคำพูดที่ไม่ครบคู่หรือวลีว่าง และไม่แก้คำค้นให้เอง
  • รูปคำภาษาอังกฤษ ใช้ได้กับทุกเว็บไซต์ ผลลัพธ์ภาษาอังกฤษ (en, en-GB, en_US และรหัสทำนองนี้) จับคู่ด้วยรูปคำ ผลลัพธ์ภาษาอื่นจับคู่ทั้งคำ ระบบเลือกวิธีจับคู่ตามภาษาของผลลัพธ์แต่ละรายการ การค้นหาภาษาไทยที่ใช้รายการภาษาอังกฤษแทนจึงจับคู่รายการภาษาอังกฤษด้วยรูปคำ และรายการภาษาไทยด้วยทั้งคำ
  • ภาษาที่เขียนโดยไม่เว้นวรรคระหว่างคำ เช่น ภาษาไทย จะจับคู่ทั้งช่วงตัวอักษรเมื่อใช้ ทั้งคำ ให้เลือก บางส่วนของคำ สำหรับภาษาเหล่านั้น
  • การเปลี่ยนแปลงมีผลกับการค้นหาครั้งถัดไป รูปคำทั้งหมดถูกเก็บไว้ตอนบันทึกเนื้อหา จึงไม่มีการบิลด์ใหม่ และการจับคู่แบบเก่ากับแบบใหม่ไม่ปนกันในคำตอบเดียว หน้าผลลัพธ์ที่เปิดไว้ก่อนการเปลี่ยนแปลงจะขอให้ค้นหาใหม่เมื่อผู้เยี่ยมชมขอผลเพิ่ม

หน้าค้นหาและส่วนค้นหาจะทำเครื่องหมายคำที่ตรงกันในชื่อและสรุปของผลลัพธ์ วลีจะถูกไฮไลต์เฉพาะเมื่อคำอยู่ติดกันตามลำดับ ส่วนข้อความคงข้อความต้นฉบับไว้ อักขระที่ดูเหมือนมาร์กอัปจึงยังเป็นข้อความ คำตอบค้นหาและคำแนะนำอาจมี title_parts และ summary_parts ซึ่งแต่ละส่วนมี text และ match ตัวแสดงผลที่ทำเองใช้ข้อมูลนี้ได้ และต้องแสดงค่าเป็นข้อความ ไม่ใช่ HTML คำตอบเก่าที่ไม่มีส่วนเหล่านี้ยังแสดงได้โดยไม่มีไฮไลต์

ลำดับความสำคัญของรายการเปลี่ยนเฉพาะลำดับ ไม่ได้เพิ่มผลที่ไม่ตรงคำค้น

รายการจะค้นเจอได้จากชื่อของรายการที่มันลิงก์ถึงผ่านฟิลด์ความสัมพันธ์ด้วย เช่น โพสต์ค้นเจอได้จากชื่อผู้เขียน:

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

ไซต์ที่ managed renderer ให้บริการจะค้นหาสิ่งที่เผยแพร่อยู่ตอนนี้ ไม่ต้องบิลด์ใหม่:

  • การเผยแพร่จะค้นเจอทันที การเลิกเผยแพร่ภาษาหนึ่ง การย้ายรายการไปถังขยะ การลบ และการเปลี่ยนที่อยู่ก็มีผลทันทีเช่นกัน
  • ผลลัพธ์แสดงในภาษาของผู้เข้าชม ภายใต้นโยบาย fallback รายการที่ไม่มีภาษานั้นจะแสดงในภาษาสำรองภาษาแรกที่มีเนื้อหาเผยแพร่ตามลำดับที่กำหนด
  • ร่าง ประเภทเนื้อหาส่วนตัว และรายการที่ตั้ง ซ่อนจากเครื่องมือค้นหา จะไม่ปรากฏ
  • /search ค้นหาในภาษาเริ่มต้น และ /<language>/search ค้นหาในภาษาอื่น เครื่องมือค้นหาจะไม่ทำดัชนีหน้าเหล่านี้
  • ส่วน ค้นหาในเว็บไซต์ บนหน้าใดก็ได้แสดงช่องค้นหาเดียวกันและแสดงผลลัพธ์ภายในส่วนนั้น

หากการค้นหาตอบไม่ได้ หน้ายังโหลดได้และแจ้งว่า “Search is not available right now. Try again later.” การค้นหาที่ล้มเหลวไม่เคยบล็อก release

หน้าที่เผยแพร่ซึ่งมีที่อยู่ /search หรือ /<language>/search จะบล็อก release ใหม่ขณะเปิดการค้นหา เปลี่ยนที่อยู่ของหน้านั้น หรือปิดการค้นหา

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

  • /search ค้นหาในภาษาเริ่มต้น และ /<language>/search ค้นหาในภาษาอื่น เว็บไซต์ที่สร้างขึ้นมีหน้าเหล่านี้สำหรับภาษาเริ่มต้นและสำหรับทุกภาษาที่มีเนื้อหาเผยแพร่หรือที่ Blog ใช้ ภาษาของไซต์ที่ยังไม่มีอะไรเผยแพร่จะไม่มีหน้าค้นหาจนกว่าจะบิลด์ครั้งถัดไปหลังจากมีการเผยแพร่ เมนูนำทางของเว็บไซต์ลิงก์ไปที่หน้าเหล่านี้ หน้าเหล่านี้เรนเดอร์ทุกคำขอ ไม่ถูกแคช และเครื่องมือค้นหาจะไม่ทำดัชนี
  • ส่วน ค้นหาในเว็บไซต์ ทำให้หน้าของมันเรนเดอร์ทุกคำขอ ผลลัพธ์แสดงภายในส่วนนั้น ช่องค้นหาทุกช่องในหน้าเดียวกันใช้การค้นหาร่วมกันหนึ่งครั้ง
  • การเผยแพร่หน้าและโพสต์บล็อก การเลิกเผยแพร่ภาษาหนึ่ง การย้ายไปถังขยะ การลบ และการเปลี่ยนที่อยู่ มีผลต่อผลการค้นหาทันที ตัวเลือกใน ค้นหาเพิ่มเติมใน และ การจับคู่และการจัดอันดับ ก็มีผลเช่นกัน
  • ผลลัพธ์ลิงก์ไปยังหน้าของมันตามที่อยู่ที่บิลด์นี้กำหนด และโพสต์ลิงก์ไปยังที่อยู่ใน Blog หน้าที่เผยแพร่หลังการบิลด์ล่าสุด หรือรายการของประเภทเนื้อหาอื่น จะแสดงโดยไม่มีลิงก์จนกว่าการบิลด์ครั้งถัดไปจะกำหนดที่อยู่ให้
  • เมื่อปิดการค้นหาหรือภาษาไม่รู้จัก จะตอบ 404 หากการค้นหาตอบไม่ได้ หน้าค้นหาจะตอบ 503 และแจ้งว่า “Search is not available right now. Try again later.” ส่วนค้นหาบนหน้าไม่เคยทำให้หน้านั้นล้มเหลว

การค้นหาอ่าน /v1/_search บนโฮสต์ของไซต์เอง Worker ของไซต์จึงต้องมี global_fetch_strictly_public ใน apps/site/wrangler.jsonc ไซต์ใหม่มีค่านี้อยู่แล้ว ไฟล์เดิมที่ไม่มีค่านี้จะบล็อกการเตรียมและการ deploy ไซต์โดยระบุชื่อ

คำสั่งของเว็บไซต์ที่สร้างขึ้นที่ตรวจสอบแล้วยังเหมือนเดิม:

หน้าต่างเทอร์มินัล
node scripts/install-dependencies.mjs apps/site
npm run --prefix apps/site check
npm run --prefix apps/site build

ห้ามรัน npm install เปล่าๆ ในโครงสร้างที่สร้างขึ้น การสร้างใหม่จะคงไฟล์ dependency ที่ใช้ร่วมกันไว้ ดู การขยายแบ็กเอนด์

ช่องค้นหาทุกช่องบนไซต์แบบ managed หรือเว็บไซต์ที่สร้างขึ้นจะแนะนำรายการที่ตรงกันขณะผู้เข้าชมพิมพ์:

  • คำแนะนำเริ่มเมื่อพิมพ์ครบสองตัวอักษร และแสดงรายการที่เผยแพร่แล้วได้สูงสุดห้ารายการ: ชื่อเรื่อง สรุปสั้น และลิงก์ คำจะจับคู่ตาม การจับคู่ ของประเภท คำสุดท้ายพิมพ์ไม่ครบได้และจะตรงกับส่วนต้นของคำ (ตรงไหนก็ได้ในคำเมื่อใช้ บางส่วนของคำ) รายการที่ชื่อเรื่องขึ้นต้นด้วยคำที่พิมพ์มาก่อน ตามด้วยรายการที่ชื่อเรื่องมีคำเหล่านั้น แล้วจึงเป็นรายการอื่น เสนอเฉพาะรายการที่มีที่อยู่บนไซต์นี้ ประเภทที่ปรับไว้จะตรงเฉพาะฟิลด์ที่ติ๊ก
  • คำแนะนำอ่านเนื้อหาสดชุดเดียวกับการค้นหา: ร่าง ประเภทเนื้อหาส่วนตัว ถังขยะ ภาษาที่ยังไม่เผยแพร่ และรายการที่ซ่อนจากเครื่องมือค้นหา จะไม่ปรากฏ การเผยแพร่หรือการถอนจะแสดงผลทันที
  • ใช้ปุ่มลูกศรเลื่อนในรายการ Enter เปิดรายการที่ไฮไลต์อยู่ ถ้าไม่มีรายการที่ไฮไลต์จะค้นหาตามปกติ Escape ปิดรายการ และ Escape ครั้งที่สองล้างช่อง การคลิกหรือแตะจะเปิดรายการ โปรแกรมอ่านหน้าจอรับรู้รายการเป็น combobox และบอกว่ามีคำแนะนำกี่รายการ
  • หากโหลดคำแนะนำไม่ได้ รายการจะซ่อนอยู่และช่องค้นหายังใช้งานได้ หากไม่มี JavaScript ช่องนี้เป็นฟอร์มค้นหาธรรมดา
  • ไม่มีการเก็บหรือนับสิ่งที่ผู้เข้าชมพิมพ์

ช่องนี้เรียก /search?suggest=<words>&locale=<language> ของไซต์เอง ซึ่งอ่าน GET /v1/_search/suggest และสร้างลิงก์ของแต่ละรายการแบบเดียวกับผลการค้นหา นโยบายความปลอดภัยของไซต์แบบ managed อนุญาตสคริปต์นั้นเพียงตัวเดียว ด้วย hash

front end ที่คุณสร้างเองเรียก endpoint เดียวกันได้จากเซิร์ฟเวอร์ของมัน:

หน้าต่างเทอร์มินัล
curl "https://example.com/v1/_search?q=lighthouse&locale=en&limit=10"

ทุกคำใน q ต้องตรงตามการจับคู่ของแต่ละประเภท (ดู เลือกวิธีจับคู่คำ) คำในวลีที่ใส่เครื่องหมายคำพูดคู่ต้องอยู่ติดกันตามลำดับในฟิลด์เดียวกัน น้ำหนักฟิลด์และลำดับความสำคัญที่เผยแพร่ของรายการจะรวมกันเพื่อกำหนดอันดับ เวลาเผยแพร่ใช้ตัดสินเมื่ออันดับเท่ากัน ส่ง page.next_cursor กลับเป็น cursor เพื่อขอหน้าถัดไปของคำค้นเดิม cursor จากก่อนเปลี่ยนการจัดอันดับหรือการจับคู่จะถูกปฏิเสธด้วย public_search_invalid ให้เริ่มค้นหาใหม่ ผลลัพธ์ให้ kind, model, slug และ locale; อาจมี title_parts และ summary_parts สำหรับไฮไลต์อย่างปลอดภัย สร้างลิงก์ด้วยเส้นทางของคุณเอง search_off หมายถึงการค้นหาของไซต์ปิดอยู่ API อ่านข้อมูลสาธารณะ แสดงพารามิเตอร์และการปฏิเสธทั้งหมด

สำหรับคำแนะนำ ให้ส่ง q หนึ่งค่าเท่านั้น (2 ถึง 100 ตัวอักษร) locale หนึ่งค่า และ limit หากต้องการ (1 ถึง 10 ค่าเริ่มต้น 5):

หน้าต่างเทอร์มินัล
curl "https://example.com/v1/_search/suggest?q=light&locale=en"

ระบบจับคู่คำตามวิธีที่เลือกไว้สำหรับเนื้อหาแต่ละประเภท และคำสุดท้ายพิมพ์ไม่ครบได้ คำตอบมี query, data, limit และ locale แต่ละรายการมีฟิลด์เดียวกับผลการค้นหา

ดัชนีที่เลือกเปิดได้นี้ใช้กับการค้นหาเนื้อหาที่เกี่ยวข้อง เนื้อหาซ้ำ คำแนะนำความสัมพันธ์และลิงก์ และบริบทสำหรับ AI ไม่ได้แทนที่การค้นหาของผู้เข้าชมหรือตัวรวบรวมข้อมูล API สาธารณะด้านล่าง

ผู้ดูแลระบบเชื่อม Cloudflare Vectorize (cosine, 1024 มิติ) และ Workers AI ผ่าน SEMANTIC_INDEX กับ SEMANTIC_AI โดยใช้โมเดล @cf/baai/bge-m3 ดูการตั้งค่าระบบ ซึ่งต้องมีดัชนีเมตาดาต้าชนิด string สำหรับ projection, locale, model และตัวประมวลผลงานเบื้องหลังที่ทำงานอยู่

เปิด การตั้งค่า → การสร้างเนื้อหา → โมเดล → ดัชนีความหมาย การบันทึกต้องมี site:settings และ ai:generate เปิดใช้ เลือกโมเดลที่อ่านได้ และระบุคีย์ฟิลด์คั่นด้วยจุลภาคได้ตามต้องการ ค่าเริ่มต้นคือ ข้อความสาธารณะที่เผยแพร่แล้ว ตัวเลือก รวมฉบับร่างและฟิลด์ส่วนตัว ขยายไปยังข้อความที่ผู้ตั้งค่าดัชนี ยังมีสิทธิ์อ่านอยู่ ข้อความส่งไปยัง Workers AI ส่วน Vectorize เก็บเวกเตอร์ รหัส และแฮช ไม่เก็บข้อความต้นฉบับ คำค้นและแต่ละชุดการสร้างเวกเตอร์ใช้โควตา AI ของไซต์ และมีค่าบริการผู้ให้บริการด้วย

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

เมื่อเนื้อหาเปลี่ยน ระบบเข้าคิวอัปเดตหรือลบ ฟิลด์ที่ไม่เปลี่ยนใช้เวกเตอร์เดิม ก่อนแสดงผลจะอ่านเนื้อหาปัจจุบัน และตรวจสิทธิ์ของฟิลด์ ภาษา การเผยแพร่ เวอร์ชัน และกฎการเลือกรายการซ้ำ คะแนนความคล้ายไม่ให้สิทธิ์อ่านข้อมูล แต่ละไซต์แยกกันด้วย namespace

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

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

การตั้งค่าดัชนีเชิงความหมายในเครื่อง โดยยังไม่ได้จัดทำดัชนีผ่านผู้ให้บริการ

การค้นหาแบบสแตติกสำหรับเว็บไซต์ที่คุณบิลด์เอง

หัวข้อที่มีชื่อว่า “การค้นหาแบบสแตติกสำหรับเว็บไซต์ที่คุณบิลด์เอง”

สำหรับเว็บไซต์สถิตทั่วไป เพิ่ม Pagefind ผ่านกระบวนการ dependency ปกติของโครงการ แล้วเรียก executable ที่ตรึงเวอร์ชันหลังบิลด์ HTML คำสั่งที่เพิ่มในสคริปต์บิลด์คือ pagefind --site dist เมื่อ dist เป็นโฟลเดอร์ผลลัพธ์จริง เผยแพร่ HTML พร้อมไฟล์ค้นหาที่ตรงกัน การบิลด์ล้มเหลวต้องไม่แทนดีพลอยล่าสุดที่สำเร็จ

บริการเช่น Typesense หรือ Meilisearch ต้องมีกฎถอนข้อมูลอย่างชัดเจน การ upsert ซ้ำอย่างเดียวไม่ลบรายการที่ถูกลบ ถอนเผยแพร่ หรือย้ายออกจากขอบเขต Dee Wan ไม่ได้เป็นเจ้าของ client เหล่านี้หรือการเปลี่ยนดัชนีแบบ atomic ของบริการ

กำหนดขอบเขตครบถ้วนเป็นชุด (site, model, locale) ที่ตรวจแล้ว เตรียมดัชนีรุ่นใหม่ที่ว่างสำหรับ ทุก ชุด รวบรวมทุกหน้าจนครบ ตรวจทุกคำตอบ และเขียนเฉพาะรุ่นเตรียม ใช้เว็บไซต์ โมเดล ID รายการที่คงที่ และภาษาจริงเป็นคีย์ ไม่ใช้ slug ที่เปลี่ยนได้ ข้ามรายการ fallback ของภาษาอื่นในรอบภาษานั้น ส่ง cursor โดยไม่แก้ หาก cursor หาย ซ้ำ หรือขัดแย้ง รูปแบบรายการผิด HTTP ผิดพลาด หมดเวลา หรือขอบเขตใดล้มเหลว ให้ยกเลิกทั้งการสร้าง

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

เก็บ revision ของรุ่นใช้งานตอนเริ่มเตรียม การเปิดใช้ต้องเปรียบเทียบ revision แบบ atomic หรือเรียงการสร้างใหม่ทีละงาน เพื่อไม่ให้รอบเก่าที่ช้ากว่าเขียนทับรอบใหม่ หากการตอบรับการเปิดใช้สูญหาย ผลการเปิดใช้จะไม่แน่ชัด adapter ต้องตรวจว่ารุ่นนั้นทำงานอยู่หรือไม่ และ discard ต้องไม่ลบข้อมูลที่กำลังใช้ การเขียนหลายคีย์หรือ pointer ในที่เก็บแบบ eventually consistent อย่างเดียวไม่พิสูจน์สัญญานี้

ตัวรวบรวมแบบเตรียมรุ่นที่ไม่ใช้ dependency export rebuildSearch({ scopes, readPage, stage, maxPages, maxDocuments }) ตัวมันเองไม่เรียกผู้ให้บริการ ให้ส่งการทำงานของ adapter ต่อไปนี้:

การทำงาน พฤติกรรมที่ต้องมี
readPage(scope, cursor) บังคับ timeout และ HTTP สำเร็จ ตอบ {data, page} ของ API สาธารณะ โดย page มี boolean has_more และ next_cursor ที่เป็น null ได้
stage.begin(scopes) สร้างรุ่นว่างแยกต่างหากและเก็บ revision ปัจจุบัน ห้ามล้างหรือเขียนดัชนีที่ใช้งาน
stage.write(generation, batch) เขียนเฉพาะรุ่นนั้น ปฏิเสธการเขียนที่ผิดพลาดหรือไม่ครบ แต่ละรายการมี key รวม, scope และ item ต้นฉบับ adapter เป็นผู้เลือกฟิลด์ค้นหา
stage.activate(generation) เปิดใช้รุ่นที่ครบถ้วนแบบ atomic โดยป้องกันไม่ให้งานสร้างรุ่นเก่าเขียนทับรุ่นใหม่ และตรวจสอบผลการเปิดใช้ที่ไม่แน่ชัดโดยอ้างอิงข้อมูลระบุตัวรุ่น
stage.discard(generation) ลบเฉพาะข้อมูลเตรียมที่ไม่ใช้งาน ห้ามล้างรุ่นที่ใช้อยู่ แม้หลังคำตอบเปิดใช้ที่ไม่แน่ชัด

ตัวอย่างจำกัดจำนวนหน้าต่อขอบเขตและจำนวนเอกสารที่รับทั้งหมด ตั้งใจให้ข้อมูลรับรอง การตั้งค่าดัชนี และการดึงฟิลด์อยู่ใน adapter ค้นหาที่มีอยู่ การตรวจซอร์สเฉพาะจุดครอบคลุมการถอนสำเร็จ การแทนด้วยชุดว่าง ข้อผิดพลาดหลังขอบเขตหนึ่งเสร็จ cursor ผิด การเตรียมล้มเหลว และการเปิดใช้พร้อมกันที่ขัดแย้ง เรียก node --test scripts/search-index.test.mjs จากรีโพซิทอรี CMS

การอ่านครบทุกหน้าไม่พิสูจน์ว่าเป็น snapshot เวลาเดียวกันขณะเนื้อหาเปลี่ยน สำหรับการสลับที่ต้องแม่นยำ ให้ตกลงหยุดเผยแพร่หรือใช้ published snapshot ที่ยอมรับแล้ว มิฉะนั้นระบุขอบเขตความสดและทำซ้ำ แคช API สาธารณะเมื่อเปิดใช้อาจทำให้เห็นการถอนช้าลง อย่ารับประกันว่าจะหายทันที

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

แจ้งระบบอื่นเมื่อเนื้อหาถูกเผยแพร่ด้วย เว็บฮุกขาออก


ยังไม่เปิดตัว (pre-MVP) และยังไม่มีเวอร์ชันเสถียร
คอมมิตซอร์สโค้ด: e207e63239a627fbd2ae9c414ef7c6eb19fcfe5a (มีการแก้ไขที่ยังไม่คอมมิต)
วันที่สร้างเอกสาร (UTC): 2026-10-21T09:28:24.214Z
คอมมิตสำหรับอัปเกรด: ระบุไม่ได้: มีการแก้ไขที่ยังไม่คอมมิต. บันทึกการเปลี่ยนแปลง