Lanjut ke konten
Samkarsa Logbook

Jualan v1.5.0-087: Audit Mesin Pencari & Transformasi Arsitektur Dual-Tier Smart Retrieval

Audit mendalam 4 kasus kendala pencarian & retrieval data toko (autocomplete item/supplier, master catalog, dan riwayat transaksi) serta implementasi Dual-Tier Smart Engine.

4mnt baca

Pengguna sistem Toko Sembako Kusuma melaporkan 4 kendala signifikan terkait pencarian dan retrieval data pada aplikasi web blonjo dan API sajen:

  1. Autocomplete Transaksi Lambat & Data Hilang:
    • Di awal pencarian, dropdown autocomplete transaksi muncul lebih lambat (latensi tinggi).
    • Sebagian besar item barang dan nama supplier tidak pernah muncul di daftar saran autocomplete.
  2. Data Item di Master List Tidak Muncul Lengkap:
    • Pencarian item di menu Master Data sering menghasilkan hasil kosong saat kata kunci ditulis dalam format singkatan atau urutan kata berbeda.
  3. Pencarian Riwayat Transaksi Tidak Efektif & Rentang Tanggal Terpotong:
    • Pencarian transaksi di menu riwayat tidak dapat menemukan transaksi berdasarkan nama supplier, nama item belanja, maupun nominal uang.
    • Ketika filter rentang tanggal (date range) diperluas (misalnya 3 bulan s/d 1 tahun), data transaksi terpotong dan tidak menampilkan seluruh data.
  4. Nama Supplier Terpotong di Master Data & Fitur Pencarian Macet:
    • Sebagian nama supplier tidak tampil di tabel master data dan tidak dapat ditemukan melalui search bar.

Pemeriksaan kode sumber frontend/backend serta inspeksi langsung pada database produksi VPS mengungkap 4 akar masalah teknis:

  • Temuan Data: Dari total 562 produk di database toko, hanya 148 produk (26.3%) yang memiliki vector embedding. Sebanyak 414 produk (73.7%) memiliki nilai Product.embedding IS NULL.
  • Akar Masalah: Endpoint /inventory/autocomplete-semantic di inventory.py menerapkan filter kaku .filter(Product.embedding.isnot(None)). Akibatnya, 414 produk toko secara otomatis dibuang dari autocomplete.
  • Overhead Komputasi: Backend menjalankan model neural network ONNX (get_onnx_embedding) pada CPU VPS di setiap jeda ketikan (debounce), memicu lonjakan latensi hingga 300ms–1500ms.
  • Kendala Supplier: Komponen SmartTextarea.tsx mewajibkan kata awalan regex kaku /(?:^|[\s\n])(toko|supplier|di)\s+/i. Jika user mengetik nama supplier secara langsung tanpa awalan tersebut, autocomplete tidak pernah aktif.

  • Temuan Data: Toko Sembako Kusuma memiliki 70 entitas supplier aktif di database.
  • Akar Masalah: Endpoint backend get_contacts (inventory.py) memiliki parameter default skip=0, limit=50. Frontend SupplierPage.tsx memanggil endpoint tanpa argumen limit, sehingga backend hanya mengembalikan 50 supplier pertama. Sebanyak 20 supplier (nomor 51–70) tidak pernah di-load oleh browser, sehingga pencarian di frontend untuk 20 supplier tersebut selalu gagal.

  • Akar Masalah: Filter tabel produk di ItemPage.tsx menggunakan algoritma substring kaku item.name.toLowerCase().includes(searchQuery.toLowerCase()).
  • Dampak: Pencarian kata majemuk dengan urutan kata acak (misal mencari “aqua 600” padahal tersimpan “Aqua Botol 600ml”) langsung menghasilkan 0 hasil, menciptakan persepsi bahwa data barang hilang dari master.

  • Akar Masalah Pemotongan Data: Frontend daftar-input.tsx memanggil /finance/transactions?start_date=...&end_date=...&limit=250. Batasan statis limit=250 memangkas seluruh transaksi di atas nomor urut 250 saat rentang tanggal diperluas.
  • Akar Masalah Search Tidak Efektif: Pencarian hanya memeriksa kolom reference_no dan description. Relasi nama supplier (Contact.name), nama item belanja (InventoryLog.product.name), dan nominal total nota tidak disertakan dalam kueri pencarian.

Untuk mengatasi seluruh kendala tersebut dengan kecepatan sub-millisecond tanpa membebani CPU server VPS, sistem beralih ke arsitektur Dual-Tier Smart Engine:

[ User Input / Search Query ]
│
┌──────┴─────────────────────────────────────────┐
▼ ▼
[ TIER 1: In-Memory Client-Side Engine ] [ TIER 2: PostgreSQL Deep Search ]
• Dipakai di: Autocomplete & Master Data • Dipakai di: Riwayat Transaksi
• Dataset: Preloaded Cache (~150 KB) • Mekanisme: Multi-table SQL JOIN
• Latensi: < 2 ms (Zero Server Load) • Pencarian: Supplier, Item, Nominal
• Fitur: Multi-Token & Typo Tolerance • Paginasi: Dinamis Tanpa Batas Kaku

  1. Preloaded Catalog Cache: Seluruh master produk (562 item) dan supplier (70 kontak) dimuat ke memori browser saat inisialisasi (~150 KB JSON payload).
  2. Multi-Token Tokenizer: Kueri pencarian dipecah per kata (query.split(/\s+/)). Setiap token dicocokkan secara independen sehingga urutan kata terbalik dan singkatan tetap akurat.
  3. Pencarian Autocomplete Tanpa Barrier: Regex pemicu kaku supplier dihilangkan; autocomplete dapat mendeteksi nama supplier maupun produk secara langsung seketika.

  1. Multi-Column & Relation JOIN: Endpoint /finance/transactions meng-join tabel contacts dan inventory_logs -> products. Pencarian kata kunci mencakup No Bukti, Keterangan, Nama Supplier, Nama Barang, dan Nilai Nominal.
  2. Dinamisasi Batas Limit: Saat pengguna menentukan filter tanggal (start_date & end_date), limit kaku 250 ditiadakan agar seluruh transaksi dalam rentang waktu tersebut tersaji utuh.

Komponen / File Modifikasi Utama
sajen/app/api/v1/inventory.py Naikkan default limit=1000 pada get_contacts, tambahkan parameter search, dan perbaiki endpoint autocomplete dengan fallback ILIKE/Trigram untuk produk tanpa embedding.
sajen/app/api/v1/accounting.py Perbarui get_transactions dengan filter pencarian lintas tabel (Contact, Item, Total Amount) dan hapus batas kaku 250 transaksi pada date range.
blonjo/src/pages/master-data/SupplierPage.tsx Ubah endpoint fetch kontak dengan limit=1000 dan terapkan multi-token filtering di frontend.
blonjo/src/pages/master-data/ItemPage.tsx Terapkan multi-token searching agar pencarian urutan acak/singkatan selalu menemukan item.
blonjo/src/pages/transaction/daftar-input.tsx Tingkatkan limit query saat date range aktif dan perluas search filter mencakup supplier, item, dan nominal.
blonjo/src/components/SmartTextarea.tsx Hapus aturan awalan kaku supplier dan optimalkan autocomplete instan berbasis in-memory catalog cache.

  1. Master Supplier: 100% dari 70 supplier langsung muncul di tabel dan dapat dicari secara instan.
  2. Master Item: Seluruh 555 produk aktif dapat dicari dengan variasi kata/singkatan tanpa ada item yang hilang.
  3. Autocomplete Transaksi: Latensi turun dari ~800ms menjadi < 2ms (instan), dengan 100% item dan supplier terdeteksi tanpa cold-start.
  4. Riwayat Transaksi: Data dalam rentang tanggal luas tersaji lengkap tanpa terpotong batas 250, dan pencarian dapat menemukan transaksi melalui nama supplier, nama barang, ataupun nominal nota.