Pautan Asal: https://i18n.site/blog/tech/search
Urutan
Selepas beberapa minggu pembangunan, i18n.site (terjemahan berbilang bahasa & alat pembinaan tapak web) kini menyokong carian teks penuh bahagian hadapan yang tulen.
Artikel ini akan berkongsi pelaksanaan teknikal carian teks penuh bahagian hadapan tulen i18n.site. Lawati i18n.site untuk merasai kefungsian carian.
Kod adalah sumber terbuka: Carian kernel / antara muka Interaktif
Gambaran Keseluruhan Penyelesaian Carian Teks Penuh Tanpa Pelayan
Untuk tapak web statik semata-mata dan bersaiz sederhana seperti dokumen/blog peribadi, membina bahagian belakang carian teks penuh binaan sendiri adalah terlalu berat dan carian teks penuh tanpa perkhidmatan ialah pilihan yang lebih biasa.
Penyelesaian carian teks penuh tanpa pelayan dibahagikan kepada dua kategori utama:
Yang pertama melibatkan penyedia perkhidmatan carian pihak ketiga seperti algolia.com yang menawarkan komponen bahagian hadapan untuk carian teks penuh.
Perkhidmatan sedemikian memerlukan pembayaran berdasarkan volum carian dan selalunya tidak tersedia kepada pengguna di tanah besar China kerana isu pematuhan.
Ia tidak boleh digunakan di luar talian atau pada intranet dan mempunyai had yang ketara. Artikel ini tidak akan menghuraikan lebih lanjut.
Kategori kedua ialah carian teks penuh bahagian hadapan tulen.
Pada masa ini, alatan carian teks penuh bahagian hadapan tulen biasa termasuk lunrjs dan ElasticLunr.js (pembangunan sekunder berdasarkan lunrjs).
lunrjs mempunyai dua kaedah untuk membina indeks, kedua-duanya dengan isu mereka sendiri.
- Fail indeks pra-bina
Oleh kerana indeks termasuk semua perkataan daripada dokumen, ia bersaiz besar.
Setiap kali dokumen ditambah atau diubah suai, fail indeks baharu mesti dimuatkan.
Ini meningkatkan masa menunggu pengguna dan menggunakan sejumlah besar lebar jalur.
- Memuatkan dokumen dan membina indeks dengan pantas
Membina indeks ialah tugas yang intensif dari segi pengiraan, dan membina semula indeks dengan setiap akses boleh menyebabkan kelewatan yang ketara, yang membawa kepada pengalaman pengguna yang buruk.
Selain lunrjs, terdapat penyelesaian carian teks penuh lain, seperti:
fusejs, yang mencari dengan mengira persamaan antara rentetan.
Penyelesaian ini mempunyai prestasi yang lemah dan tidak sesuai untuk carian teks penuh (rujuk Fuse.js Pertanyaan panjang mengambil masa lebih 10 saat, bagaimana untuk mengoptimumkan?).
TinySearch, yang menggunakan penapis Bloom untuk mencari, tidak boleh melakukan carian awalan (cth., memasukkan goo untuk mencari kebaikan atau google) dan tidak boleh mencapai kesan autolengkap.
Disebabkan oleh kelemahan penyelesaian sedia ada, i18n.site telah membangunkan penyelesaian carian teks penuh bahagian hadapan tulen baharu dengan ciri berikut:
- Menyokong carian berbilang bahasa, dengan saiz yang padat; kernel carian, apabila dibungkus dengan gzip, hanya 6.9KB (sebagai perbandingan, lunrjs ialah 25KB)
- Membina indeks terbalik berdasarkan IndexedDB, dengan penggunaan memori yang rendah dan prestasi pantas
- Apabila dokumen ditambah/diubah suai, hanya dokumen yang ditambah atau diubah suai diindeks semula, mengurangkan jumlah pengiraan
- Menyokong carian awalan, membenarkan paparan masa nyata hasil carian semasa pengguna menaip
- Ketersediaan Luar Talian
Butiran pelaksanaan teknikal i18n.site akan diperkenalkan di bawah.
Pembahagian Kata Berbilang Bahasa
Pembahagian perkataan menggunakan Intl.Segmenter asli penyemak imbas, yang disokong oleh semua penyemak imbas arus perdana.
Kod skrip kopi untuk pembahagian perkataan adalah seperti berikut:
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()
Di mana:
-
/p{P}/ ialah ungkapan biasa yang sepadan dengan tanda baca, termasuk: ! " # $ % & ' ( ) * , - . / : ; ? @ [ ] ^ _ { | } ~. .
- split('.' )adalah kerana pembahagian perkataan Firefoxbrowser tidak membahagikan.` .
Pembinaan Indeks
Lima jadual storan objek dibuat dalam IndexedDB:
- perkataan: id - perkataan
- dokumen: id - URL dokumen - nombor versi dokumen
- docWord: id dokumen - tatasusunan id perkataan
- awalan: awalan - susunan id perkataan
- rindex: id perkataan - id dokumen - tatasusunan nombor baris
Dengan menghantar tatasusunan url dokumen dan nombor versi ver, jadual dokumen disemak untuk kewujudan dokumen. Jika ia tidak wujud, indeks terbalik dicipta. Pada masa yang sama, indeks terbalik untuk dokumen yang tidak dihantar masuk dikeluarkan.
Kaedah ini membenarkan pengindeksan tambahan, mengurangkan beban pengiraan.
In the front-end interface, a progress bar for index loading can be displayed to avoid lag during the initial load. See "Animated Progress Bar, Based on a Single progress + Pure CSS Implementation" English / Chinese.
IndexedDB High Concurrent Writing
The project is developed based on the asynchronous encapsulation of IndexedDB, idb.
IndexedDB reads and writes are asynchronous. When creating an index, documents are loaded concurrently to build the index.
To avoid data loss due to concurrent writes, you can refer to the following coffeescript code, which adds a ing cache between reading and writing to intercept competitive writes.
`coffee
pusher = =>
ing = new Map()
(table, id, val)=>
id_set = ing.get(id)
if id_set
id_set.add val
returnid_set = new Set([val]) ing.set id, id_set pre = await table.get(id) li = pre?.li or [] loop to_add = [...id_set] li.push(...to_add) await table.put({id,li}) for i from to_add id_set.delete i if not id_set.size ing.delete id break return
rindexPush = pusher()
prefixPush = pusher()
`Prefix Real-Time Search
To display search results in real-time as the user types, for example, showing words like words and work that start with wor when wor is entered.
The search kernel uses the prefix table for the last word after segmentation to find all words with that prefix and search sequentially.
An anti-shake function, debounce (implemented as follows), is used in the front-end interaction to reduce the frequency of searches triggered by user input, thus minimizing computational load.
js
export default (wait, func) => {
var timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(func.bind(this, ...args), wait);
};
}
Precision and Recall
The search first segments the keywords entered by the user.
Assuming there are N words after segmentation, the results are first returned with all keywords, followed by results with N-1, N-2, ..., 1 keywords.
The search results displayed first ensure query precision, while subsequent loaded results (click the "Load More" button) ensure recall.
On-Demand Loading
To improve response speed, the search uses the yield generator to implement on-demand loading, returning results after each limit query.
Note that after each yield, a new IndexedDB query transaction must be opened for the next search.
Prefix Real-Time Search
To display search results in real-time as the user types, for example, showing words like words and work that start with wor when wor is entered.
The search kernel uses the prefix table for the last word after segmentation to find all words with that prefix and search sequentially.
An anti-shake function, debounce (implemented as follows), is used in the front-end interaction to reduce the frequency of searches triggered by user input, thus minimizing computational load.
js
export default (wait, func) => {
var timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(func.bind(this, ...args), wait);
};
}
Offline Availability
The index table does not store the original text, only words, reducing storage space.
Highlighting search results requires reloading the original text, and using service worker can avoid repeated network requests.
Also, because service worker caches all articles, once a search is performed, the entire website, including search functionality, becomes offline available.
Optimization for Displaying MarkDown Documents
The pure front-end search solution provided by i18n.site is optimized for MarkDown documents.
When displaying search results, the chapter name is shown, and clicking navigates to that chapter.
Summary
The pure front-end implementation of inverted full-text search, without the need for a server, is very suitable for small to medium-sized websites such as documents and personal blogs.
i18n.site's open-source self-developed pure front-end search is compact, responsive, and addresses the various shortcomings of current pure front-end full-text search solutions, providing a better user experience.
Atas ialah kandungan terperinci Carian Teks Penuh Terbalik Bahagian Hadapan Tulen. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Penjelasan terperinci mengenai kaedah penggantian rentetan javascript dan Soalan Lazim Artikel ini akan meneroka dua cara untuk menggantikan watak rentetan dalam JavaScript: Kod JavaScript dalaman dan HTML dalaman untuk laman web. Ganti rentetan di dalam kod JavaScript Cara yang paling langsung ialah menggunakan kaedah pengganti (): str = str.replace ("cari", "ganti"); Kaedah ini hanya menggantikan perlawanan pertama. Untuk menggantikan semua perlawanan, gunakan ungkapan biasa dan tambahkan bendera global g: str = str.replace (/fi

Artikel membincangkan membuat, menerbitkan, dan mengekalkan perpustakaan JavaScript, memberi tumpuan kepada perancangan, pembangunan, ujian, dokumentasi, dan strategi promosi.

Artikel ini membincangkan strategi untuk mengoptimumkan prestasi JavaScript dalam pelayar, memberi tumpuan kepada mengurangkan masa pelaksanaan dan meminimumkan kesan pada kelajuan beban halaman.

Bawa kesan filem matriks ke halaman anda! Ini adalah plugin jQuery yang sejuk berdasarkan filem terkenal "The Matrix". Plugin mensimulasikan kesan aksara hijau klasik dalam filem, dan hanya pilih gambar dan plugin akan mengubahnya menjadi gambar gaya matriks yang diisi dengan aksara angka. Datang dan cuba, sangat menarik! Bagaimana ia berfungsi Plugin memuat imej ke kanvas dan membaca nilai piksel dan warna: data = ctx.getimagedata (x, y, settings.grainsize, settings.grainsize) .data Plugin dengan bijak membaca kawasan segi empat tepat gambar dan menggunakan jQuery untuk mengira warna purata setiap kawasan. Kemudian, gunakan

Artikel ini membincangkan debugging JavaScript yang berkesan menggunakan alat pemaju pelayar, memberi tumpuan kepada menetapkan titik putus, menggunakan konsol, dan menganalisis prestasi.

Artikel ini akan membimbing anda untuk membuat karusel gambar mudah menggunakan perpustakaan jQuery. Kami akan menggunakan perpustakaan BXSlider, yang dibina di atas jQuery dan menyediakan banyak pilihan konfigurasi untuk menubuhkan karusel. Pada masa kini, Gambar Carousel telah menjadi ciri yang mesti ada di laman web - satu gambar lebih baik daripada seribu perkataan! Selepas membuat keputusan untuk menggunakan karusel gambar, soalan seterusnya adalah bagaimana untuk menciptanya. Pertama, anda perlu mengumpul gambar-gambar resolusi tinggi yang berkualiti tinggi. Seterusnya, anda perlu membuat karusel gambar menggunakan HTML dan beberapa kod JavaScript. Terdapat banyak perpustakaan di web yang dapat membantu anda membuat karusel dengan cara yang berbeza. Kami akan menggunakan Perpustakaan BXSlider Sumber Terbuka. Perpustakaan BXSlider menyokong reka bentuk responsif, jadi karusel yang dibina dengan perpustakaan ini dapat disesuaikan dengan mana -mana

Mata utama yang dipertingkatkan penandaan berstruktur dengan JavaScript dapat meningkatkan kebolehcapaian dan pemeliharaan kandungan laman web sambil mengurangkan saiz fail. JavaScript boleh digunakan secara berkesan untuk menambah fungsi secara dinamik ke elemen HTML, seperti menggunakan atribut CITE untuk memasukkan pautan rujukan secara automatik ke dalam rujukan blok. Mengintegrasikan JavaScript dengan tag berstruktur membolehkan anda membuat antara muka pengguna yang dinamik, seperti panel tab yang tidak memerlukan penyegaran halaman. Adalah penting untuk memastikan bahawa peningkatan JavaScript tidak menghalang fungsi asas laman web; Teknologi JavaScript Lanjutan boleh digunakan (

Set data sangat penting dalam membina model API dan pelbagai proses perniagaan. Inilah sebabnya mengapa mengimport dan mengeksport CSV adalah fungsi yang sering diperlukan. Dalam tutorial ini, anda akan belajar cara memuat turun dan mengimport fail CSV dalam sudut


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Dreamweaver Mac版
Alat pembangunan web visual

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

Dreamweaver CS6
Alat pembangunan web visual

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini