## ภาคที่ 4: การควบคุมคำค้นหาอย่างเชี่ยวชาญ ### ไวยากรณ์คำค้นหาและตัวดำเนินการ NoteRich รองรับไวยากรณ์คำค้นหาที่มีประสิทธิภาพสำหรับการค้นหาข้อมูลอย่างแม่นยำ #### การค้นหาแบบพื้นฐาน เพียงแค่พิมพ์คำค้นหาเพื่อค้นหาข้อมูลทั้งหมดที่มีการจัดเก็บไว้: ``` Quarterly marketing strategy ``` นี่คือการค้นหาที่รวมทั้งชื่อเรื่องและเนื้อหาทั้งหมด ผลลัพธ์จะถูกจัดลำดับตามความเกี่ยวข้อง #### การค้นหาหลายคำด้วยสัญลักษณ์ OR ใช้สัญลักษณ์ `|` เพื่อค้นหาคำหลายคำที่แตกต่างกัน: ``` Q4 planning | quarterly review | year-end summary ``` นี่คือการค้นหาที่ตรงกับคำใดคำหนึ่งที่ระบุไว้ ซึ่งเหมาะสำหรับการประชุมที่มีคำศัพท์ที่แตกต่างกัน #### ระบบการให้คะแนนที่มีน้ำหนัก NoteRich ใช้อัลกอริทึมการให้คะแนนที่ซับซ้อน: ``` Match Type | Weight | Description --------------------|--------|------------------------------------- Precise (title_raw) | 1.0 | การค้นหาแบบตรงกับชื่อเรื่องโดยแม่นยำ Fuzzy (title) | 0.8 | การค้นหาแบบแบ่งส่วนตามคำที่แยกออกมาในเนื้อหา Fuzzy (content) | 0.8 | การค้นหาแบบแบ่งส่วนตามเนื้อหา ``` ผลลัพธ์จะถูกจัดลำดับตาม: 1. **ความสำคัญของประเภทการค้นหา**: การค้นหาแบบตรงกับชื่อเรื่องมีคะแนนสูงกว่าการค้นหาแบบแบ่งส่วน 2. **คะแนนรวม**: การค้นหาหลายคำจะเพิ่มคะแนน 3. **การครอบคลุมของคำค้นหาย่อย**: บันทึกที่ตรงกับคำค้นหาย่อยจะมีคะแนนสูงกว่า ### ตัวอย่างการค้นหาในสถานการณ์จริง #### ตัวอย่างที่ 1: การค้นหาบันทึกการประชุม ```javascript // คำค้นหา "team standup | daily sync | morning meeting" // จะค้นหาบันทึกที่มีคำเหล่านี้อยู่ด้วยกัน // โดยให้ความสำคัญกับการค้นหาชื่อเรื่องโดยแม่นยำ ``` #### ตัวอย่างที่ 2: การค้นหาเอกสารทางเทคนิค ```javascript // คำค้นหา "API endpoint authentication" // จะค้นหาบันทึกที่มีคำว่า "API" และ "endpoint" และ "authentication" // โดยให้คำว่า "API" ถูกค้นหาเป็นคำเดียว // และสามารถค้นหาได้ทั้งแบบ camelCase และแบบที่มีตัวอักษรแยกกัน ``` #### ตัวอย่างที่ 3: การค้นหาในเอกสารหลายภาษา ```javascript // คำค้นหา (รวมภาษาอังกฤษและจีน) "project roadmap 项目规划" // จะค้นหาในทั้งสองภาษาได้พร้อมกัน ``` ### ตัวช่วยในการค้นหาในเอกสารยาว หนึ่งในคุณสมบัติที่โดดเด่นของ NoteRich คือความสามารถในการจัดการเอกสารยาวได้อย่างราบรื่น ไม่ว่าคุณจะทำงานกับเอกสารข้อกำหนดทางเทคนิค บทความวิจัย หรือเอกสารโครงการที่ละเอียด คุณสามารถค้นหาข้อมูลที่ต้องการได้อย่างง่ายดาย #### วิธีการค้นหาในเอกสาร เมื่อคุณทำการค้นหา NoteRich จะไม่เพียงแค่แสดงเอกสารที่ตรงกับคำค้นหาเท่านั้น แต่ยังให้การค้นหาแบบ **ตรงกับเนื้อหาเอกสาร** ด้วย: ```mermaid sequenceDiagram participant User participant SearchEngine participant DocumentIndex participant Viewer User->>SearchEngine: เขียนคำค้นหา SearchEngine->>DocumentIndex: ค้นหาในทุก workspaces DocumentIndex-->>SearchEngine: 返回เอกสารที่ตรงกับคำค้นหา + ตำแหน่งของข้อมูล SearchEngine->>User: แสดงผลลัพธ์พร้อมจำนวนการค้นหา User->>User: คลิกที่ผลลัพธ์ SearchEngine->>Viewer: เปิดเอกสารที่ตำแหน่งแรก Viewer->>User: แสดงตัวควบคุมการค้นหา User->>Viewer: เดินทางระหว่างผลลัพธ์ (Next/Previous) Viewer->>User: แสดงตัวบ่งชี้ตำแหน่งของข้อมูล (เช่น "3 of 12") ``` #### คุณสมบัติสำคัญสำหรับเอกสารยาว 1. **การแสดงจำนวนการค้นหา**: ผลลัพธ์แต่ละรายการจะแสดงจำนวนการค้นหาในเอกสารนั้น (เช่น "Annual Report 2024 · 15 matches") ช่วยให้คุณรู้ว่าอนุกรมใดมีเนื้อหาที่เกี่ยวข้องมากที่สุด 2. **การเปิดดูเอกสารทันที**: การคลิกที่ผลลัพธ์จะเปิดเอกสารและเลื่อนไปที่ข้อมูลแรกที่ตรงกับคำค้นหา โดยข้อความที่ตรงกับคำค้นหาจะถูกแสดงให้เห็นทันที 3. **ตัวควบคุมการค้นหา**: ใช้คีย์ล็อกหรือปุ่มหน้าจอเพื่อสลับระหว่างผลลัพธ์ทั้งหมด: - `F3` หรือ `Cmd+G`: ผลลัพธ์ถัดไป - `Shift+F3` หรือ `Shift+Cmd+G`: ผลลัพธ์ก่อนหน้า - ตัวบ่งชี้ที่มองเห็นได้แสดงตำแหน่งปัจจุบันของคุณ (เช่น "Match 7 of 23") 4. **การเน้นข้อความที่ตรงกับคำค้นหา**: ทุกตัวอย่างของคำค้นหาจะถูกเน้นให้เห็นพร้อมกัน ช่วยให้คุณเห็นภาพรวมของการกระจายตัวของข้อมูลในเอกสารได้อย่างชัดเจน 5. **การรักษาเนื้อหาโดยรอบ**: เมื่อคุณสลับระหว่างผลลัพธ์ เนื้อหาโดยรอบจะยังคงเห็นได้ ช่วยให้คุณไม่หลงทางในการค้นหาในเอกสารที่มีเนื้อหามากมาย #### ตัวอย่างในสถานการณ์จริง: การค้นหาเอกสารข้อกำหนดทางเทคนิค สมมติว่าคุณมีเอกสารข้อกำหนดทางเทคนิคที่มีขนาด 50,000 ตัวอักษร คุณต้องการค้นหาคำว่า "authentication protocol" ทั้งหมด: | ขั้นตอน | การดำเนินการ | ผลลัพธ์ | |------|--------|--------| | 1 | พิมพ์ `authentication protocol` ในช่องค้นหา | เอกสารข้อกำหนดทางเทคนิคจะปรากฏพร้อมกับ "8 matches" | | 2 | คลิกที่ผลลัพธ์ที่ค้นพบ | เอกสารจะเปิดขึ้นและเลื่อนไปที่ข้อมูลแรกที่ตรงกับคำค้นหา | | 3 | กด `F3` 7 ครั้ง | ตรวจสอบ 8 ตัวอย่างที่ตรงกับคำค้นหาเรียงลำดับ | | 4 | ดูข้อความที่ถูกเน้น | ดูภาพรวมของการกระจายตัวของคำค้นหา | | 5 | อ่านเนื้อหาโดยรอบ | เนื้อหาทั้งหมดจะถูกเก็บไว้ในแต่ละขั้นตอน | คุณสมบัตินี้ช่วยเปลี่ยนเอกสารยาวให้กลายเป็นโครงสร้างข้อมูลที่สามารถเข้าถึงได้ง่าย โดยข้อมูลทุกอย่างอยู่ใกล้กับปากกาเพียงไม่กี่ครั้งเท่านั้น #### เคล็ดลับสำหรับการค้นหาในเอกสารยาว - **ใช้คำที่เฉพาะเจาะจง**: การใช้คำค้นหาที่ยาวเกินไปอาจทำให้เกิดการค้นหาที่ไม่ถูกต้องในเอกสารขนาดใหญ่ - **ตรวจสอบจำนวนการค้นหา**: จำนวนการค้นหาที่สูงอาจบ่งบอกถึงคำที่ใช้บ่อยเกินไป - **รวมกับการกรอง workspaces**: ค้นหาใน workspaces ที่เฉพาะเจาะจงเพื่อจำกัดขอบเขตการค้นหา - **ใช้ชื่อเรื่องที่ชัดเจน**: จัดรูปแบบหัวข้อของส่วนต่างๆ ให้ชัดเจนเพื่อการค้นหาที่แม่นยำ --- ## ภาคที่ 5: ประสิทธิภาพในขนาดใหญ่ ### การจัดเก็บข้อมูลโดยใช้ IndexedDB NoteRich ใช้ **IndexedDB** เพื่อจัดเก็บข้อมูลในระบบพื้นฐานที่มีประสิทธิภาพ ทำให้สามารถค้นหาได้ทันทีแม้ในเอกสารที่มีขนาดใหญ่ #### โครงสร้างฐานข้อมูล แต่ละ workspaces มีฐานข้อมูล IndexedDB ของตัวเอง: ``` noterich_note_database_{workspaceId} → ข้อมูลเมตาดาต้าและเนื้อหาของบันทึก noterich_search_index_{workspaceId} → เอกสารดัชนีการค้นหา ``` การแยกนี้ช่วยให้: - **การสลับระหว่าง workspaces ได้อย่างรวดเร็ว**: ไม่มีการโหลดข้อมูลระหว่าง workspaces - **การสำรองข้อมูลแบบอิสระ**: สามารถสำรอง workspaces ได้แยกกัน - **การควบคุมสิทธิ์แบบเฉพาะเจาะจง**: การควบคุมการเข้าถึงข้อมูลแบบละเอียด ### การอัปเดตดัชนีแบบ incremental แทนที่จะสร้างดัชนีการค้นหาใหม่ทุกครั้ง NoteRich ใช้การอัปเดตแบบ incremental ที่ฉลาด: ```mermaid graph LR A[บันทึกข้อมูล] --> B{ดัชนีมีอยู่หรือไม่?} B -->|มี| C[เปรียบเทียบวันที่] B -->|ไม่มี| D[สร้างดัชนีใหม่ทั้งหมด] C -->|ใหม่กว่า| E[อัปเดตข้อมูลในดัชนี] C -->|เก่ากว่า| F[ข้ามไป-ที่มีอยู่แล้ว] E --> G[เก็บข้อมูลไว้ใน IndexedDB] D --> G F --> H[ดัชนีปัจจุบัน] ``` ### ประสิทธิภาพในการทดสอบ การทดสอบของเราแสดงให้เห็นถึงประสิทธิภาพที่ยอดเยี่ยมแม้ในขนาดใหญ่: ```echarts { "xAxis": { "type": "category", "data": ["1k Notes", "5k Notes", "10k Notes", "20k Notes", "50k Notes"], "axisLabel": { "color": "#666", "rotate": 0 } }, "yAxis": [ { "type": "value", "name": "จำนวนบันทึก", "splitLine": { "lineStyle": { "color": "#f4f4f5" } }, "axisLabel": { "color": "#666" } }, { "type": "value", "name": "ความล่าช้า (ms)", "splitLine": { "show": false }, "axisLabel": { "color": "#666" } } ], "series": [ { "name": "จำนวนบันทึก", "data": [1000, 5000, 10000, 20000, 50000], "type": "bar", "itemStyle": { "color": "#eaeaea", "borderRadius": [4, 4, 0, 0] } }, { "name": "ความล่าช้าในการค้นหา", "data": [8, 12, 15, 22, 35], "type": "line", "yAxisIndex": 1, "smooth": true, "lineStyle": { "color": "#000", "width": 3 }, "itemStyle": { "color": "#000" }, "symbol": "circle", "symbolSize": 8 } ], "grid": { "left": "10%", "right": "10%", "bottom": "15%" }, "legend": { "data": ["จำนวนบันทึก", "ความล่าช้าในการค้นหา"], "bottom": 0, "textStyle": { "color": "#666" } } } ``` แม้จะมี **50,000 บันทึก** ก็ยังสามารถค้นหาข้อมูลได้ภายใน 40 วินาที ซึ่งเร็วกว่าการกระพริบตาเสียอีก ### ประสิทธิภาพด้านการใช้หน่วยความจำ เครื่องมือการค้นหาใช้โครงสร้างข้อมูลที่ปรับปรุงแล้ว: - **FlexSearch Document Index**: ผสมผสานฟิลด์หลายฟิลด์เข้าด้วยกันเพื่อสร้างดัชนีที่มีประสิทธิภาพ - **Map of Notes Shared**: เก็บข้อมูลเมตาดาต้าของบันทึกไว้แบบ O(1) - **การประมวลผลแบบ Batch**: อัปเดตดัชนีเป็นชุดเพื่อป้องกันการกระตุ้นหน้าจอ - **การโหลดแบบ Lazy Loading**: อัปเดตดัชนีเมื่อมีการสลับระหว่าง workspaces --- ## ภาคที่ 6: วิธีการจัดการ workspaces ที่ดีที่สุด ### การสร้างโครงสร้าง workspaces ที่มีประสิทธิภาพ #### รูปแบบที่แนะนำ **รูปแบบที่ 1: การแบ่งตามหัวข้อ** ``` ├── work-engineering ├── work-marketing ├── work-hr └── personal ``` **รูปแบบที่ 2: การจัดระเบียบตามโครงการ** ``` ├── project-alpha ├── project-beta ├── project-gamma └── archive-2024 ``` **รูปแบบที่ 3: การจัดระเบียบตามช่วงเวลา** ``` ├── 2025-q1 ├── 2025-q2 ├── 2025-q3 └── 2025-q4 ``` ### เมื่อใดควรสร้าง workspaces ใหม่ ควรสร้าง workspaces ใหม่เมื่อ: ✅ **มีการแบ่งขอบเขตที่ชัดเจน**: งานโครงการ ทีม หรือหัวข้อต่างๆ ✅ **ต้องการการควบคุมการเข้าถึงที่แตกต่างกัน**: บันทึกบางบันทึกต้องการการแบ่งปันที่จำกัด ✅ **ฐานข้อมูลขยายใหญ่**: แบ่งออกเมื่อ workspaces ใดมีบันทึกมากกว่า 10,000 บันทึก ✅ **ความต้องการในการทำงานร่วมกันแตกต่างกัน**: ผู้ร่วมงานที่แตกต่างกันสำหรับหัวข้อต่างๆ ### เมื่อใดควรอยู่ใน workspaces เดียว ควรเก็บบันทึกไว้ด้วยกันเมื่อ: ❌ **มีการเชื่อมโยงกันบ่อย**: บันทึกมักเชื่อมโยงกันอยู่เสมอ ❌ **ต้องการค้นหาในหัวข้อต่างๆ**: มักจะค้นหาในเนื้อหาทั้งหมด ❌ **ค่าใช้จ่ายในการตั้งค่าไม่คุ้มค่า**: สำหรับบันทึกที่มีน้อยกว่า <1,000 บันทึก