[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-3375":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":18,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":24,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":43,"readmeContent":44,"aiSummary":45,"trendingCount":16,"starSnapshotCount":16,"syncStatus":17,"lastSyncTime":46,"discoverSource":47},3375,"flexsearch","nextapps-de\u002Fflexsearch","nextapps-de","Next-generation full-text search library for Browser and Node.js","",null,"JavaScript",13724,524,95,28,0,2,7,31,43.16,"Apache License 2.0",false,"master",true,[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"elasticsearch","full-text-search","fulltext-search","fuzzy","fuzzy-search","javascript","javascript-library","nodejs","open-source","search","search-algorithm","search-engine","search-in-text","searching","searching-algorithms","web","web-worker","2026-06-12 02:00:49","\u003C!-- FlexSearch v0.8: [Overview and Migration Guide](doc\u002F0.8.0.md) -->\nGetting instant help by the DeepWiki AI assistant:\n\n[\u003Cimg src=\"https:\u002F\u002Fdevin.ai\u002Fassets\u002Fdeepwiki-badge.png\" alt=\"Ask DeepWiki.com\" height=\"20\"\u002F>](https:\u002F\u002Fdeepwiki.com\u002Fnextapps-de\u002Fflexsearch)\n\n\u003Ch2>\u003C\u002Fh2>\n\u003Ch1>\n    \u003Cimg src=\"doc\u002Fflexsearch-logo-glass-animated.svg\" style=\"width: 580px; max-width: 100%\" alt=\"FlexSearch.js: Next-Generation full-text search library for Browser and Node.js\">\n    \u003Cp>\u003C\u002Fp>\n\u003C\u002Fh1>\n\u003Ch3>Next-Generation full-text search library for Browser and Node.js\u003C\u002Fh3>\n\n\u003Ca target=\"_blank\" href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fflexsearch\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fflexsearch.svg\">\u003C\u002Fa>\n\u003Ca target=\"_blank\" href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Factions\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fbuild-passing-brightgreen\">\u003C\u002Fa>\n\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fcoverage-84%25-yellow\">\n\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Ftyped-75%25-yellow\">\u003C!--\u003Ca target=\"_blank\" href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fissues\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues\u002Fnextapps-de\u002Fflexsearch.svg\">\u003C\u002Fa>-->\n\u003Ca target=\"_blank\" href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fblob\u002Fmaster\u002FLICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fl\u002Fflexsearch.svg\">\u003C\u002Fa>\n\n[Basic Start](#load-library) &ensp;&bull;&ensp; \n[API Reference](#api-overview) &ensp;&bull;&ensp;\n[Encoder](doc\u002Fencoder.md) &ensp;&bull;&ensp;\n[Document Search](doc\u002Fdocument-search.md) &ensp;&bull;&ensp;\n[Persistent Indexes](doc\u002Fpersistent.md) &ensp;&bull;&ensp;\n[Using Worker](doc\u002Fworker.md) &ensp;&bull;&ensp;\n[Tag Search](doc\u002Fdocument-search.md#tag-search) &ensp;&bull;&ensp;\n[Highlighting](doc\u002Fresult-highlighting.md) &ensp;&bull;&ensp;\n[Resolver](doc\u002Fresolver.md) &ensp;&bull;&ensp;\n[Changelog](CHANGELOG.md)\n\n## Please Support this Project\n\nFlexSearch has been helping developers around the world build powerful, efficient search functionalities for years. Maintaining and improving the library requires significant time and resources. If you’ve found this project valuable and you're interested in supporting the project, please consider donating. Thanks a lot for your continued support!\n\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fflexsearch\u002Fdonate\" target=\"_blank\" style=\"margin-right: 10px\">\u003Cimg src=\"doc\u002Fopencollective.png\" height=\"32\" alt=\"Donate using Open Collective\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fts-thomas\u002F\" target=\"_blank\" style=\"margin-right: 10px\">\u003Cimg src=\"doc\u002Fgithub-sponsors.png\" height=\"32\" alt=\"Donate using Github Sponsors\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fliberapay.com\u002Fts-thomas\u002Fdonate\" target=\"_blank\" style=\"margin-right: 10px\">\u003Cimg src=\"doc\u002Fliberapay.svg\" height=\"32\" alt=\"Donate using Liberapay\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fwww.patreon.com\u002Fuser?u=96245532\" target=\"_blank\" style=\"margin-right: 10px\">\u003Cimg src=\"doc\u002Fpatron.png\" height=\"32\" alt=\"Donate using Patreon\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fwww.paypal.com\u002Fdonate\u002F?hosted_button_id=GEVR88FC9BWRW\" target=\"_blank\">\u003Cimg src=\"doc\u002Fpaypal.png\" height=\"32\" alt=\"Donate using PayPal\">\u003C\u002Fa>\n\n### FlexSearch Sponsors\n\n\u003Ca href=\"https:\u002F\u002Fantithesis.com\" target=\"_blank\" style=\"display: inline-block\">\n    \u003Ccenter>\n        \u003Cimg src=\"doc\u002Fantithesis_logo.svg\" width=\"200\" alt=\"Donate using Open Collective\">\u003Cbr>\n        Antithesis Operations LLC\n    \u003C\u002Fcenter>\n\u003C\u002Fa>\n\u003Ch1>\u003C\u002Fh1>\n\nFlexSearch performs queries up to 1,000,000 times faster \u003Ca href=\"https:\u002F\u002Fnextapps-de.github.io\u002Fflexsearch\u002F\" target=\"_blank\">compared to other libraries\u003C\u002Fa> by also providing \u003Ca href=\"https:\u002F\u002Fnextapps-de.github.io\u002Fflexsearch\u002Fmatch.html\" target=\"_blank\">powerful search capabilities\u003C\u002Fa> like multi-field search (document search), phonetic transformations, partial matching, tag-search, result highlighting or suggestions.\n\nBigger workloads are scalable through workers to perform any updates or queries to the index in parallel through dedicated balanced threads.\n\nThe latest generation v0.8 introduce [Persistent Indexes](doc\u002Fpersistent.md), well optimized for scaling of large datasets and running in parallel. All available features was natively ported right into the database engine of your choice.\n\nFlexSearch was nominated by the GitNation for the \"Best Technology of the Year\".\n\nSupported Platforms:\n- Browser\n- Node.js\n\nSupported Database:\n- InMemory (Default)\n- [IndexedDB (Browser)](doc\u002Fpersistent-indexeddb.md)\n- [Redis](doc\u002Fpersistent-redis.md)\n- [SQLite](doc\u002Fpersistent-sqlite.md)\n- [Postgres](doc\u002Fpersistent-postgres.md)\n- [MongoDB](doc\u002Fpersistent-mongodb.md)\n- [Clickhouse](doc\u002Fpersistent-clickhouse.md)\n\nSupported Charsets:\n- Latin\n- Chinese, Korean, Japanese (CJK)\n- Hindi\n- Arabic\n- Cyrillic\n- Greek and Coptic\n- Hebrew\n\nCommon Code Examples:\n\n- Node.js: [Module (ESM)](example\u002Fnodejs-esm)\n- Node.js: [CommonJS](example\u002Fnodejs-commonjs)\n- Browser: [Module (ESM)](example\u002Fbrowser-module)\n- Browser: [Legacy Script](example\u002Fbrowser-legacy)\n\nDemos:\n- \u003Ca href=\"https:\u002F\u002Fraw.githack.com\u002Fnextapps-de\u002Fflexsearch\u002Fmaster\u002Fdemo\u002Fautocomplete.html\" target=\"_blank\">Auto-Complete\u003C\u002Fa>\n\n\u003Ca name=\"benchmark\">\u003C\u002Fa>\nBenchmarks:\n- \u003Ca href=\"https:\u002F\u002Fnextapps-de.github.io\u002Fflexsearch\u002F\" target=\"_blank\">Performance Benchmark\u003C\u002Fa>\n- \u003Ca href=\"https:\u002F\u002Fnextapps-de.github.io\u002Fflexsearch\u002Fmatch.html\" target=\"_blank\">Matching Benchmark\u003C\u002Fa>\n\n\u003Cdetails>\n\u003Csummary>Latest Benchmark Results\u003C\u002Fsummary>\n\u003Cbr>\nThe benchmark was measured in terms per seconds, higher values are better (except the test \"Memory\").\nThe memory value refers to the amount of memory which was additionally allocated during search.\u003Cbr>\n\n\u003Ctable>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Cth>Library\u003C\u002Fth>\n        \u003Cth>Memory\u003C\u002Fth>\n        \u003Cth>Query: Single\u003C\u002Fth>\n        \u003Cth>Query: Multi\u003C\u002Fth>\n        \u003Cth>Query: Large\u003C\u002Fth>\n        \u003Cth>Query: Not Found\u003C\u002Fth>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch\u003C\u002Ftd>\n        \u003Ctd align=\"right\">16\u003C\u002Ftd>\n        \u003Ctd align=\"right\">50955718\u003C\u002Ftd>\n        \u003Ctd align=\"right\">11912730\u003C\u002Ftd>\n        \u003Ctd align=\"right\">13981110\u003C\u002Ftd>\n        \u003Ctd align=\"right\">51706499\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>jsii\u003C\u002Ftd>\n        \u003Ctd align=\"right\">2188\u003C\u002Ftd>\n        \u003Ctd align=\"right\">13847\u003C\u002Ftd>\n        \u003Ctd align=\"right\">949559\u003C\u002Ftd>\n        \u003Ctd align=\"right\">1635959\u003C\u002Ftd>\n        \u003Ctd align=\"right\">3730307\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>wade\u003C\u002Ftd>\n        \u003Ctd align=\"right\">980\u003C\u002Ftd>\n        \u003Ctd align=\"right\">60473\u003C\u002Ftd>\n        \u003Ctd align=\"right\">443214\u003C\u002Ftd>\n        \u003Ctd align=\"right\">419152\u003C\u002Ftd>\n        \u003Ctd align=\"right\">1239372\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>js-search\u003C\u002Ftd>\n        \u003Ctd align=\"right\">237\u003C\u002Ftd>\n        \u003Ctd align=\"right\">22982\u003C\u002Ftd>\n        \u003Ctd align=\"right\">383775\u003C\u002Ftd>\n        \u003Ctd align=\"right\">426609\u003C\u002Ftd>\n        \u003Ctd align=\"right\">994803\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>minisearch\u003C\u002Ftd>\n        \u003Ctd align=\"right\">4777\u003C\u002Ftd>\n        \u003Ctd align=\"right\">30589\u003C\u002Ftd>\n        \u003Ctd align=\"right\">191657\u003C\u002Ftd>\n        \u003Ctd align=\"right\">5849\u003C\u002Ftd>\n        \u003Ctd align=\"right\">304233\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>orama\u003C\u002Ftd>\n        \u003Ctd align=\"right\">5355\u003C\u002Ftd>\n        \u003Ctd align=\"right\">29445\u003C\u002Ftd>\n        \u003Ctd align=\"right\">170231\u003C\u002Ftd>\n        \u003Ctd align=\"right\">4454\u003C\u002Ftd>\n        \u003Ctd align=\"right\">225491\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>elasticlunr\u003C\u002Ftd>\n        \u003Ctd align=\"right\">3073\u003C\u002Ftd>\n        \u003Ctd align=\"right\">14326\u003C\u002Ftd>\n        \u003Ctd align=\"right\">48558\u003C\u002Ftd>\n        \u003Ctd align=\"right\">101206\u003C\u002Ftd>\n        \u003Ctd align=\"right\">95840\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>lunr\u003C\u002Ftd>\n        \u003Ctd align=\"right\">2443\u003C\u002Ftd>\n        \u003Ctd align=\"right\">11527\u003C\u002Ftd>\n        \u003Ctd align=\"right\">51476\u003C\u002Ftd>\n        \u003Ctd align=\"right\">88858\u003C\u002Ftd>\n        \u003Ctd align=\"right\">103386\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>ufuzzy\u003C\u002Ftd>\n        \u003Ctd align=\"right\">13754\u003C\u002Ftd>\n        \u003Ctd align=\"right\">2799\u003C\u002Ftd>\n        \u003Ctd align=\"right\">7788\u003C\u002Ftd>\n        \u003Ctd align=\"right\">58544\u003C\u002Ftd>\n        \u003Ctd align=\"right\">9557\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>bm25\u003C\u002Ftd>\n        \u003Ctd align=\"right\">33963\u003C\u002Ftd>\n        \u003Ctd align=\"right\">3903\u003C\u002Ftd>\n        \u003Ctd align=\"right\">4777\u003C\u002Ftd>\n        \u003Ctd align=\"right\">12657\u003C\u002Ftd>\n        \u003Ctd align=\"right\">12471\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>fuzzysearch\u003C\u002Ftd>\n        \u003Ctd align=\"right\">300147\u003C\u002Ftd>\n        \u003Ctd align=\"right\">148\u003C\u002Ftd>\n        \u003Ctd align=\"right\">229\u003C\u002Ftd>\n        \u003Ctd align=\"right\">455\u003C\u002Ftd>\n        \u003Ctd align=\"right\">276\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>fuse\u003C\u002Ftd>\n        \u003Ctd align=\"right\">247107\u003C\u002Ftd>\n        \u003Ctd align=\"right\">422\u003C\u002Ftd>\n        \u003Ctd align=\"right\">321\u003C\u002Ftd>\n        \u003Ctd align=\"right\">337\u003C\u002Ftd>\n        \u003Ctd align=\"right\">329\u003C\u002Ftd>\n    \u003C\u002Ftr>\n\u003C\u002Ftable>\n\nRun Comparison: \u003Ca href=\"https:\u002F\u002Fnextapps-de.github.io\u002Fflexsearch\u002F\" target=\"_blank\">Performance Benchmark \"Gulliver's Travels\"\u003C\u002Fa>\n\n\u003C\u002Fdetails>\n\nExtern Projects & Plugins:\n- React: https:\u002F\u002Fgithub.com\u002Fangeloashmore\u002Freact-use-flexsearch\n- Vue: https:\u002F\u002Fgithub.com\u002FNoction\u002Fvue-use-flexsearch\n- Gatsby: https:\u002F\u002Fwww.gatsbyjs.org\u002Fpackages\u002Fgatsby-plugin-flexsearch\u002F\n- Nikola: https:\u002F\u002Fplugins.getnikola.com\u002Fv8\u002Fflexsearch_plugin\u002F\n\n## Table of contents\n\n> [!TIP]\n> Understanding those 3 elementary things about FlexSearch will improve your results significantly: [Tokenizer](#tokenizer-partial-match), [Encoder](doc\u002Fencoder.md) and [Suggestions](#suggestions)\n\n- [Load Library (Node.js, ESM, Legacy Browser)](#load-library)\n  - [Non-Module Bundles (ES5 Legacy)](#non-module-bundles-es5-legacy)\n  - [Module (ESM)](#module-esm)\n  - [Node.js](#nodejs)\n- [Basic Usage and Variants](#basic-usage-and-variants)\n  - [Index Options](#index-options)\n  - [Search Options](#search-options)\n- [Common Code Examples (Browser, Node.js)](#common-code-examples)\n- [API Overview](#api-overview)\n- [Presets](#presets)\n- [Context Search](#context-search)\n  - [Context Options](#context-options)\n- [Fast-Update Mode](#fast-update-mode)\n- [Suggestions](#suggestions)\n- [Document Search (Multi-Field Search)](doc\u002Fdocument-search.md)\n  - [Document Index Options](doc\u002Fdocument-search.md#document-options)\n  - [Document Descriptor](doc\u002Fdocument-search.md#the-document-descriptor)\n  - [Document Search Options](doc\u002Fdocument-search.md#document-search-options)\n  - [Multi-Tag Search](doc\u002Fdocument-search.md)\n  - [Result Highlighting](doc\u002Fresult-highlighting.md)\n    - [Highlighting Options](doc\u002Fresult-highlighting.md#highlighting-options)\n      - [Boundary Options](doc\u002Fresult-highlighting.md#highlighting-boundary-options)\n      - [Ellipsis Options](doc\u002Fresult-highlighting.md#highlighting-ellipsis-options)\n- [Phonetic Search (Fuzzy Search)](#fuzzy-search)\n- [Tokenizer (Partial Search)](#tokenizer-partial-match)\n- [Charset Collection](#charset-collection)\n- [Encoder](doc\u002Fencoder.md)\n  - [Encoder Options](doc\u002Fencoder.md#encoder-options)\n  - [Universal Charset Collection](doc\u002Fencoder.md)\n  - [Latin Charset Encoder Presets](doc\u002Fencoder.md)\n  - [Language Specific Preset](doc\u002Fencoder.md)\n  - [Custom Encoder](doc\u002Fencoder.md#custom-encoder)\n- [Async Non-Blocking Runtime Balancer](doc\u002Fasync.md)\n- [Worker Indexes](doc\u002Fworker.md)\n  - [Worker Index Options](doc\u002Fworker.md#worker-index-options)\n- [Resolver (Complex Queries)](doc\u002Fresolver.md)\n  - [Resolver Options](doc\u002Fresolver.md)\n  - [Boolean Operations (and, or, xor, not)](doc\u002Fresolver.md)\n  - [Boost](doc\u002Fresolver.md)\n  - [Limit \u002F Offset](doc\u002Fresolver.md)\n  - [Resolve](doc\u002Fresolver.md)\n- [Auto-Balanced Cache by Popularity\u002FLast Query](#auto-balanced-cache-by-popularity)\n- [Export \u002F Import Indexes](doc\u002Fexport-import.md)\n  - [Fast-Boot Serialization](doc\u002Fexport-import.md#fast-boot-serialization-for-server-side-rendering-php-python-ruby-rust-java-go-nodejs-)\n- [Persistent Indexes](doc\u002Fpersistent.md)\n  - [Persistent Index Options](doc\u002Fpersistent.md)\n  - [IndexedDB (Browser)](doc\u002Fpersistent-indexeddb.md)\n  - [Postgres](doc\u002Fpersistent-postgres.md)\n  - [Redis](doc\u002Fpersistent-redis.md)\n  - [MongoDB](doc\u002Fpersistent-mongodb.md)\n  - [SQLite](doc\u002Fpersistent-sqlite.md)\n  - [Clickhouse](doc\u002Fpersistent-clickhouse.md)\n- [Custom Score Function](doc\u002Fcustomization.md)\n- [Custom Builds](doc\u002Fcustom-builds.md)\n- [Extended Keystores (In-Memory Index)](doc\u002Fkeystore.md)\n- [Best Practices](#best-practices)\n  - [Page-Load \u002F Fast-Boot](#page-load--fast-boot)\n  - [Prefer numeric typed IDs](#use-numeric-ids)\n\n## Load Library (Node.js, ESM, Legacy Browser)\n\n```bash\nnpm install flexsearch\n```\n\nThe **_dist_** folder is located in: `node_modules\u002Fflexsearch\u002Fdist\u002F`\n\n> It is not recommended to use the `\u002Fsrc\u002F` folder of this repository as it requires some kind of conditional compilation to resolve the build flags. The `\u002Fdist\u002F` folder contains every version you might need including unminified ES6 modules. When none of the `\u002Fdist\u002F` folder versions works for you please open an issue. Alternatively you can read more about [Custom Builds](doc\u002Fcustom-builds.md).\n\n\u003Cdetails>\n\u003Csummary>Download Builds\u003C\u002Fsummary>\n\u003Cbr>\n\u003Ctable>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>Build\u003C\u002Ftd>\n        \u003Ctd>File\u003C\u002Ftd>\n        \u003Ctd>CDN\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.bundle.min.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.bundle.min.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.bundle.min.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.bundle.min.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.bundle.debug.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.bundle.debug.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.bundle.debug.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.bundle.debug.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.bundle.module.min.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.bundle.module.min.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.bundle.module.min.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.bundle.module.min.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.bundle.module.debug.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.bundle.module.debug.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.bundle.module.debug.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.bundle.module.debug.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.compact.min.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.compact.min.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.compact.min.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.compact.min.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.compact.debug.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.compact.debug.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.compact.debug.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.compact.debug.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.compact.module.min.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.compact.module.min.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.compact.module.min.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.compact.module.min.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.compact.module.debug.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.compact.module.debug.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.compact.module.debug.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.compact.module.debug.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.light.min.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.light.min.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.light.min.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.light.min.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>****\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.light.debug.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.light.debug.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.light.debug.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.light.debug.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.light.module.min.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.light.module.min.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.light.module.min.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.light.module.min.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.light.module.debug.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.light.module.debug.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.light.module.debug.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.light.module.debug.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.es5.min.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.es5.min.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.es5.min.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.es5.min.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.es5.debug.js\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnextapps-de\u002Fflexsearch\u002Fraw\u002F0.8.2\u002Fdist\u002Fflexsearch.es5.debug.js\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.es5.debug.js\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fflexsearch.es5.debug.js\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>Javascript Modules (ESM)\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fdownload-directory.github.io\u002F?url=https%3A%2F%2Fgithub.com%2Fnextapps-de%2Fflexsearch%2Ftree%2F0.8.2%2Fdist%2Fmodule\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fmodule\u002F\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fmodule\u002F\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>Javascript Modules Minified (ESM)\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fdownload-directory.github.io\u002F?url=https%3A%2F%2Fgithub.com%2Fnextapps-de%2Fflexsearch%2Ftree%2F0.8.2%2Fdist%2Fmodule-min\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fmodule-min\u002F\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fmodule-min\u002F\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>Javascript Modules Debug (ESM)\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fdownload-directory.github.io\u002F?url=https%3A%2F%2Fgithub.com%2Fnextapps-de%2Fflexsearch%2Ftree%2F0.8.2%2Fdist%2Fmodule-debug\" target=\"_blank\">Download\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003Ca href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fmodule-debug\u002F\" target=\"_blank\">https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fnextapps-de\u002Fflexsearch@0.8.2\u002Fdist\u002Fmodule-debug\u002F\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>flexsearch.custom.js\u003C\u002Ftd>\n        \u003Ctd colspan=\"2\">\u003Ca href=\"\u002Fdoc\u002Fcustom-builds.md\">Read more about \"Custom Build\"\u003C\u002Fa>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C\u002Fdetails>\n\u003Ca name=\"bundles\">\u003C\u002Fa>\n\u003Cdetails>\n\u003Csummary>Compare Bundles: Light, Compact, Bundle\u003C\u002Fsummary>\n\u003Cbr>\n\n> The Node.js package includes all features.\n\n\u003Ctable>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>Feature\u003C\u002Ftd>\n        \u003Ctd>flexsearch.bundle.js\u003C\u002Ftd>\n        \u003Ctd>flexsearch.compact.js\u003C\u002Ftd>\n        \u003Ctd>flexsearch.light.js\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\n            \u003Ca href=\"#presets\">Presets\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\n            \u003Ca href=\"doc\u002Fasync.md\">Async Processing\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\n            \u003Ca href=\"doc\u002Fworker.md\">Workers (Web + Node.js)\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\n            \u003Ca href=\"#context-search\">Context Search\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\n            \u003Ca href=\"doc\u002Fdocument-search.md\">Document Search\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\n            \u003Ca href=\"doc\u002Fdocument-search.md#store\">Document Datastore\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\n            \u003Ca href=\"#tokenizer\">Partial Matching\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\n            \u003Ca href=\"doc\u002Fcache.md\">Auto-Balanced Cache by Popularity\u002FLast Queries\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\n            \u003Ca href=\"doc\u002Fdocument-search.md#tag-search\">Tag Search\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\n            \u003Ca href=\"#suggestions\">Suggestions\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\n            \u003Ca href=\"#fuzzy-search\">Phonetic Search (Fuzzy Search)\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ca href=\"doc\u002Fencoder.md\">Encoder\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ca href=\"doc\u002Fexport-import.md\">Export \u002F Import Indexes\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ca href=\"doc\u002Fresolver.md\">Resolver\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ca href=\"doc\u002Fresult-highlighting.md\">Result Highlighting\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ca href=\"doc\u002Fpersistent.md\">Persistent Index (IndexedDB)\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n        \u003Ctd>-\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>File Size (gzip)\u003C\u002Ftd>\n        \u003Ctd>16.3 kb\u003C\u002Ftd>\n        \u003Ctd>11.4 kb\u003C\u002Ftd>\n        \u003Ctd>4.5 kb\u003C\u002Ftd>\n    \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C\u002Fdetails>\n\n> [!TIP]\n> All debug versions are providing debug information through the console and gives you helpful advices on certain situations. Do not use them in production, since they are special builds containing extra debugging processes which noticeably reduce performance.\n\nThe abbreviations used at the end of the filenames indicates:\n\n- `bundle` All features included, FlexSearch is available on `window.FlexSearch`\n- `light` Only basic features are included, FlexSearch is available on `window.FlexSearch`\n- `es5` bundle has support for EcmaScript5, FlexSearch is available on `window.FlexSearch`\n- `module` indicates that this bundle is a Javascript module (ESM), FlexSearch members are available by `import { Index, Document, Worker, Encoder, Charset } from \".\u002Fflexsearch.bundle.module.min.js\"` or alternatively using the default export `import FlexSearch from \".\u002Fflexsearch.bundle.module.min.js\"`\n- `min` bundle is minified\n- `debug` bundle has enabled debug mode and contains additional code just for debugging purposes (do not use for production)\n\n## Load Library\n\n### Non-Module Bundles (ES5 Legacy)\n\n> Non-Module Bundles export all their features to the public namespace \"FlexSearch\" e.g. `window.FlexSearch.Index` or `window.FlexSearch.Document`.\n\nLoad the bundle by a script tag:\n\n```html\n\u003Cscript src=\"dist\u002Fflexsearch.bundle.min.js\">\u003C\u002Fscript>\n\u003Cscript>\n  \u002F\u002F ... access FlexSearch\n  var Index = window.FlexSearch.Index;\n  var index = new Index(\u002F* ... *\u002F);\n\u003C\u002Fscript>\n```\n\nFlexSearch Members are accessible on:\n```js\nvar Index = window.FlexSearch.Index;\nvar Document = window.FlexSearch.Document;\nvar Encoder = window.FlexSearch.Encoder;\nvar Charset = window.FlexSearch.Charset;\nvar Resolver = window.FlexSearch.Resolver;\nvar Worker = window.FlexSearch.Worker;\nvar IdxDB = window.FlexSearch.IndexedDB;\n\u002F\u002F only exported by non-module builds:\nvar Language = window.FlexSearch.Language;\n```\n\nLoad language packs:\n\n```html\n\u003C!-- English: -->\n\u003Cscript src=\"dist\u002Flang\u002Fen.min.js\">\u003C\u002Fscript>\n\u003C!-- German: -->\n\u003Cscript src=\"dist\u002Flang\u002Fde.min.js\">\u003C\u002Fscript>\n\u003C!-- French: -->\n\u003Cscript src=\"dist\u002Flang\u002Ffr.min.js\">\u003C\u002Fscript>\n\u003Cscript>\n  var EnglishEncoderPreset = window.FlexSearch.Language.en;\n  var GermanEncoderPreset = window.FlexSearch.Language.de;\n  var FrenchEncoderPreset = window.FlexSearch.Language.fr;\n\u003C\u002Fscript>\n```\n\n### Module (ESM)\n\nWhen using modules you can choose from 2 variants: `flexsearch.xxx.module.min.js` has all features bundled ready for production, whereas the folder `\u002Fdist\u002Fmodule\u002F` export all the features in the same structure as the source code but here compiler flags was resolved.\n\nAlso, for each variant there exist:\n1. A debug version for the development\n2. A pre-compiled minified version for production\n\nUse the bundled version exported as a module (default export):\n\n```html\n\u003Cscript type=\"module\">\n    import FlexSearch from \".\u002Fdist\u002Fflexsearch.bundle.module.min.js\";\n    const index = new FlexSearch.Index(\u002F* ... *\u002F);\n\u003C\u002Fscript>\n```\n\nOr import FlexSearch members separately by:\n\n```html\n\u003Cscript type=\"module\">\n    import { Index, Document, Encoder, Charset, Resolver, Worker, IndexedDB } \n        from \".\u002Fdist\u002Fflexsearch.bundle.module.min.js\";\n    const index = new Index(\u002F* ... *\u002F);\n\u003C\u002Fscript>\n```\n\nUse bundled style on non-bundled modules:\n\n```html\n\u003Cscript type=\"module\">\n    import { Index, Document, Encoder, Charset, Resolver, Worker, IndexedDB }\n        from \".\u002Fdist\u002Fmodule\u002Fbundle.js\";\n    const index = new Index(\u002F* ... *\u002F);\n\u003C\u002Fscript>\n```\n\nUse non-bundled modules by file default exports:\n\n```html\n\u003Cscript type=\"module\">\n    import Index from \".\u002Fdist\u002Fmodule\u002Findex.js\";\n    import Document from \".\u002Fdist\u002Fmodule\u002Fdocument.js\";\n    import Encoder from \".\u002Fdist\u002Fmodule\u002Fencoder.js\";\n    import Charset from \".\u002Fdist\u002Fmodule\u002Fcharset.js\";\n    import Resolver from \".\u002Fdist\u002Fmodule\u002Fresolver.js\";\n    import Worker from \".\u002Fdist\u002Fmodule\u002Fworker.js\";\n    import IndexedDB from \".\u002Fdist\u002Fmodule\u002Fdb\u002Findexeddb\u002Fdb.js\";\n    const index = new Index(\u002F* ... *\u002F);\n\u003C\u002Fscript>\n```\n\nLanguage packs are accessible via:\n\n```js\nimport EnglishEncoderPreset from \".\u002Fdist\u002Fmodule\u002Flang\u002Fen.js\";\nimport GermanEncoderPreset from \".\u002Fdist\u002Fmodule\u002Flang\u002Fde.js\";\nimport FrenchEncoderPreset from \".\u002Fdist\u002Fmodule\u002Flang\u002Ffr.js\";\n```\n\nAlso, pre-compiled non-bundled production-ready modules are located in `dist\u002Fmodule-min\u002F`, whereas the debug version is located at `dist\u002Fmodule-debug\u002F`.\n\nYou can also load modules via CDN:\n\n```html\n\u003Cscript type=\"module\">\n    import Index from \"https:\u002F\u002Funpkg.com\u002Fflexsearch@0.8.2\u002Fdist\u002Fmodule\u002Findex.js\";\n    const index = new Index(\u002F* ... *\u002F);\n\u003C\u002Fscript>\n```\n\n### Node.js\n\nInstall FlexSearch via NPM:\n\n```npm\nnpm install flexsearch\n```\n\nUse the default export:\n\n```js\nconst FlexSearch = require(\"flexsearch\");\nconst index = new FlexSearch.Index(\u002F* ... *\u002F);\n```\n\nOr require FlexSearch members separately by:\n\n```js\nconst { Index, Document, Encoder, Charset, Resolver, Worker } = require(\"flexsearch\");\nconst index = new Index(\u002F* ... *\u002F);\n```\n\nWhen using ESM instead of CommonJS:\n\n```js\nimport { Index, Document, Encoder, Charset, Resolver, Worker } from \"flexsearch\";\nconst index = new Index(\u002F* ... *\u002F);\n```\n\nLanguage packs are accessible via:\n\n```js\nconst EnglishEncoderPreset = require(\"flexsearch\u002Flang\u002Fen\");\nconst GermanEncoderPreset = require(\"flexsearch\u002Flang\u002Fde\");\nconst FrenchEncoderPreset = require(\"flexsearch\u002Flang\u002Ffr\");\n```\n\nPersistent Connectors are accessible via:\n\n```js\nconst Postgres = require(\"flexsearch\u002Fdb\u002Fpostgres\");\nconst Sqlite = require(\"flexsearch\u002Fdb\u002Fsqlite\");\nconst MongoDB = require(\"flexsearch\u002Fdb\u002Fmongodb\");\nconst Redis = require(\"flexsearch\u002Fdb\u002Fredis\");\nconst Clickhouse = require(\"flexsearch\u002Fdb\u002Fclickhouse\");\n```\n\n## Basic Usage and Variants\n\nThere are 3 types of indexes:\n\n1. `Index` is a flat high performance index which stores id-content-pairs.\n2. `Worker` \u002F `WorkerIndex` is also a flat index which stores id-content-pairs but runs in background as a dedicated worker thread.\n3. `Document` is multi-field index which can store complex JSON documents (could also exist of worker indexes).\n\nThe most of you probably need just one of them according to your scenario. Any of these 3 index type are upgradable to persistent indexes.\n\nThe `worker` instance inherits from type `Index` and basically works like a standard FlexSearch Index. A document index is a complex register automatically operating on several of those standard indexes in parallel. Worker-Support in documents needs to be enabled by just passing the appropriate option during creation e.g. `{ worker: true }`.\n\n```js\nindex.add(id, text);\nconst result = index.search(text, options);\n```\n\n```js\ndocument.add(doc);\nconst result = document.search(text, options);\n```\n\n```js\nawait worker.add(id, text);\nconst result = await worker.search(text, options);\n```\n\n> Every method called on a `Worker` index is treated as async. You will get back a `Promise` or you can provide a callback function as the last parameter alternatively.\n\n### Common Code Examples\n\nThe documentation will refer to several examples. A list of all examples:\n\n\u003Ca name=\"examples-nodejs\">\u003C\u002Fa>\n\u003Cdetails>\n\u003Csummary>Examples Node.js (CommonJS)\u003C\u002Fsummary>\u003Cbr>\n\n- [basic](example\u002Fnodejs-commonjs\u002Fbasic)\n- [basic-suggestion](example\u002Fnodejs-commonjs\u002Fbasic-suggestion)\n- [basic-persistent](example\u002Fnodejs-commonjs\u002Fbasic-persistent)\n- [basic-resolver](example\u002Fnodejs-commonjs\u002Fbasic-resolver)\n- [basic-worker](example\u002Fnodejs-commonjs\u002Fbasic-worker)\n- [basic-worker-extern-config](example\u002Fnodejs-commonjs\u002Fbasic-worker-extern-config)\n- [basic-worker-export-import](example\u002Fnodejs-commonjs\u002Fbasic-worker-export-import)\n- [basic-export-import](example\u002Fnodejs-commonjs\u002Fbasic-export-import)\n- [document](example\u002Fnodejs-commonjs\u002Fdocument)\n- [document-persistent](example\u002Fnodejs-commonjs\u002Fdocument-persistent)\n- [document-resolver](example\u002Fnodejs-commonjs\u002Fdocument-resolver)\n- [document-worker](example\u002Fnodejs-commonjs\u002Fdocument-worker)\n- [document-worker-extern-config](example\u002Fnodejs-commonjs\u002Fdocument-worker-extern-config)\n- [document-export-import](example\u002Fnodejs-commonjs\u002Fdocument-export-import)\n- [document-worker-export-import](example\u002Fnodejs-commonjs\u002Fdocument-worker-export-import)\n- [language-pack](example\u002Fnodejs-commonjs\u002Flanguage-pack)\n\n\u003C\u002Fdetails>\n\u003Cdetails>\n\u003Csummary>Examples Node.js (ESM\u002FModule)\u003C\u002Fsummary>\u003Cbr>\n\n- [basic](example\u002Fnodejs-esm\u002Fbasic)\n- [basic-suggestion](example\u002Fnodejs-esm\u002Fbasic-suggestion)\n- [basic-persistent](example\u002Fnodejs-esm\u002Fbasic-persistent)\n- [basic-resolver](example\u002Fnodejs-esm\u002Fbasic-resolver)\n- [basic-worker](example\u002Fnodejs-esm\u002Fbasic-worker)\n- [basic-worker-extern-config](example\u002Fnodejs-esm\u002Fbasic-worker-extern-config)\n- [basic-worker-export-import](example\u002Fnodejs-esm\u002Fbasic-worker-export-import)\n- [basic-export-import](example\u002Fnodejs-esm\u002Fbasic-export-import)\n- [document](example\u002Fnodejs-esm\u002Fdocument)\n- [document-persistent](example\u002Fnodejs-esm\u002Fdocument-persistent)\n- [document-resolver](example\u002Fnodejs-esm\u002Fdocument-resolver)\n- [document-worker](example\u002Fnodejs-esm\u002Fdocument-worker)\n- [document-worker-extern-config](example\u002Fnodejs-esm\u002Fdocument-worker-extern-config)\n- [document-export-import](example\u002Fnodejs-esm\u002Fdocument-export-import)\n- [document-worker-export-import](example\u002Fnodejs-esm\u002Fdocument-worker-export-import)\n- [language-pack](example\u002Fnodejs-esm\u002Flanguage-pack)s\n\n\u003C\u002Fdetails>\n\n\u003Ca name=\"examples-browser\">\u003C\u002Fa>\n\u003Cdetails>\n\u003Csummary>Examples Browser (Legacy)\u003C\u002Fsummary>\u003Cbr>\n\n- [basic](example\u002Fbrowser-legacy\u002Fbasic)\n- [basic-suggestion](example\u002Fbrowser-legacy\u002Fbasic-suggestion)\n- [basic-persistent](example\u002Fbrowser-legacy\u002Fbasic-persistent)\n- [basic-resolver](example\u002Fbrowser-legacy\u002Fbasic-resolver)\n- [basic-worker](example\u002Fbrowser-legacy\u002Fbasic-worker)\n- [document](example\u002Fbrowser-legacy\u002Fdocument)\n- [document-highlighting](example\u002Fbrowser-legacy\u002Fdocument-highlighting)\n- [document-persistent](example\u002Fbrowser-legacy\u002Fdocument-persistent)\n- [document-resolver](example\u002Fbrowser-legacy\u002Fdocument-resolver)\n- [document-worker](example\u002Fbrowser-legacy\u002Fdocument-worker)\n- [language-pack](example\u002Fbrowser-legacy\u002Flanguage-pack)\n\n\u003C\u002Fdetails>\n\u003Cdetails>\n\u003Csummary>Examples Browser (ESM\u002FModule)\u003C\u002Fsummary>\u003Cbr>\n\n- [basic](example\u002Fbrowser-module\u002Fbasic)\n- [basic-suggestion](example\u002Fbrowser-module\u002Fbasic-suggestion)\n- [basic-persistent](example\u002Fbrowser-module\u002Fbasic-persistent)\n- [basic-resolver](example\u002Fbrowser-module\u002Fbasic-resolver)\n- [basic-worker](example\u002Fbrowser-module\u002Fbasic-worker)\n- [basic-worker-extern-config](example\u002Fbrowser-module\u002Fbasic-worker-extern-config)\n- [document](example\u002Fbrowser-module\u002Fdocument)\n- [document-highlighting](example\u002Fbrowser-module\u002Fdocument-highlighting)\n- [document-persistent](example\u002Fbrowser-module\u002Fdocument-persistent)\n- [document-resolver](example\u002Fbrowser-module\u002Fdocument-resolver)\n- [document-worker](example\u002Fbrowser-module\u002Fdocument-worker)\n- [document-worker-extern-config](example\u002Fbrowser-module\u002Fdocument-worker-extern-config)\n- [language-pack](example\u002Fbrowser-module\u002Flanguage-pack)\n  \n\u003C\u002Fdetails>\n\n## API Overview\n\nConstructors:\n\n- new [**Index**](#basic-usage)(\\\u003Coptions\\>) : \u003Csmall>_index_\u003C\u002Fsmall>\n- new [**Document**](doc\u002Fdocument-search.md)(options) : \u003Csmall>_document_\u003C\u002Fsmall>\n- new [**Worker**](doc\u002Fworker.md)(\\\u003Coptions\\>) : \u003Csmall>_worker_\u003C\u002Fsmall>\n- new [**Encoder**](doc\u002Fencoder.md)(\\\u003Coptions\\>, \\\u003Coptions\\>, ...) : \u003Csmall>_encoder_\u003C\u002Fsmall>\n- new [**Resolver**](doc\u002Fresolver.md)(\\\u003Coptions\\>) : \u003Csmall>_resolver_\u003C\u002Fsmall>\n- new [**IndexedDB**](doc\u002Fpersistent-indexeddb.md)(\\\u003Coptions\\>) : \u003Csmall>_indexeddb_\u003C\u002Fsmall>\n\n---\n\nGlobal Members:\n\n- [**Charset**](#charset-collection)\n- [**Language**](doc\u002Fencoder.md#built-in-language-packs) (Legacy Browser Only)\n\n---\n\n`Index` \u002F `Worker`-Index Methods:\n\n- index.[**add**](#add-text-item-to-an-index)(id, string)\n- index.[**append**]()(id, string)\n- index.[**update**](#update-item-from-an-index)(id, string)\n- index.[**remove**](#remove-item-from-an-index)(id)\n- index.[**search**](#search-items)(string, \\\u003Climit\\>, \\\u003Coptions\\>)\n- index.[**search**](#search-items)(options)\n- index.[**searchCache**](#auto-balanced-cache-by-popularity)(...)\n- index.[**contain**](#check-existence-of-already-indexed-ids)(id)\n- index.[**clear**](#clear-all-items-from-an-index)()\n- index.[**cleanup**](#fast-update-mode)()\n\n##\n\n- \u003Csmall>_async_\u003C\u002Fsmall> index.[**export**](doc\u002Fexport-import.md)(handler)\n- \u003Csmall>_async_\u003C\u002Fsmall> index.[**import**](doc\u002Fexport-import.md)(key, data)\n- \u003Csmall>_async_\u003C\u002Fsmall> index.[**serialize**](doc\u002Fexport-import.md#fast-boot-serialization-for-server-side-rendering-php-python-ruby-rust-java-go-nodejs-)(boolean)\n\n##\n\n- \u003Csmall>_async_\u003C\u002Fsmall> index.[**mount**](doc\u002Fpersistent.md)(db)\n- \u003Csmall>_async_\u003C\u002Fsmall> index.[**commit**](doc\u002Fpersistent.md)()\n- \u003Csmall>_async_\u003C\u002Fsmall> index.[**destroy**](doc\u002Fpersistent.md#delete-store--migration)()\n\n---\n\n`Document` Methods:\n\n- document.[**add**](doc\u002Fdocument-search.md#addupdateremove-documents)(\\\u003Cid\\>, document)\n- document.[**append**]()(\\\u003Cid\\>, document)\n- document.[**update**](doc\u002Fdocument-search.md#addupdateremove-documents)(\\\u003Cid\\>, document)\n- document.[**remove**](doc\u002Fdocument-search.md#addupdateremove-documents)(id)\n- document.[**remove**](doc\u002Fdocument-search.md#addupdateremove-documents)(document)\n- document.[**search**](doc\u002Fdocument-search.md#document-search-field-search)(string, \\\u003Climit\\>, \\\u003Coptions\\>)\n- document.[**search**](doc\u002Fdocument-search.md#document-search-field-search)(options)\n- document.[**searchCache**](#auto-balanced-cache-by-popularity)(...)\n- document.[**contain**](doc\u002Fdocument-search.md)(id)\n- document.[**clear**](doc\u002Fdocument-search.md)()\n- document.[**cleanup**](#fast-update-mode)()\n- document.[**get**](doc\u002Fdocument-search.md#document-store)(id)\n- document.[**set**](doc\u002Fdocument-search.md#document-store)(\\\u003Cid\\>, document)\n\n##\n\n- \u003Csmall>_async_\u003C\u002Fsmall> document.[**export**](doc\u002Fexport-import.md)(handler)\n- \u003Csmall>_async_\u003C\u002Fsmall> document.[**import**](doc\u002Fexport-import.md)(key, data)\n\n##\n\n- \u003Csmall>_async_\u003C\u002Fsmall> document.[**mount**](doc\u002Fpersistent.md)(db)\n- \u003Csmall>_async_\u003C\u002Fsmall> document.[**commit**](doc\u002Fpersistent.md)()\n- \u003Csmall>_async_\u003C\u002Fsmall> document.[**destroy**](doc\u002Fpersistent.md#delete-store--migration)()\n\n`Document` Properties:\n\n- document.[**store**](doc\u002Fdocument-search.md#document-store)\n\n---\n\nAsync Equivalents (Non-Blocking Balanced):\n\n- \u003Csmall>_async_\u003C\u002Fsmall> [**.addAsync**](doc\u002Fasync.md)( ... , \\\u003Ccallback\\>)\n- \u003Csmall>_async_\u003C\u002Fsmall> [**.appendAsync**](doc\u002Fasync.md)( ... , \\\u003Ccallback\\>)\n- \u003Csmall>_async_\u003C\u002Fsmall> [**.updateAsync**](doc\u002Fasync.md)( ... , \\\u003Ccallback\\>)\n- \u003Csmall>_async_\u003C\u002Fsmall> [**.removeAsync**](doc\u002Fasync.md)( ... , \\\u003Ccallback\\>)\n- \u003Csmall>_async_\u003C\u002Fsmall> [**.searchAsync**](doc\u002Fasync.md)( ... , \\\u003Ccallback\\>)\n- \u003Csmall>_async_\u003C\u002Fsmall> [**.searchCacheAsync**](doc\u002Fasync.md)( ... , \\\u003Ccallback\\>)\n\nAsync methods will return a `Promise`, additionally you can pass a callback function as the last parameter.\n\nMethods `.export()` and also `.import()` are always async as well as every method you call on a `Worker`-based or `Persistent` Index.\n\n---\n\n`Encoder` Methods:\n\n- encoder.[**encode**](doc\u002Fencoder.md)(string)\n- encoder.[**assign**](doc\u002Fencoder.md)(options, \\\u003Coptions\\>, ...)\n- encoder.[**addFilter**](doc\u002Fencoder.md#add-language-specific-stemmer-andor-filter)(string)\n- encoder.[**addStemmer**](doc\u002Fencoder.md#add-language-specific-stemmer-andor-filter)(string => boolean)\n- encoder.[**addMapper**](doc\u002Fencoder.md)(char, char)\n- encoder.[**addMatcher**](doc\u002Fencoder.md)(string, string)\n- encoder.[**addReplacer**](doc\u002Fencoder.md)(regex, string)\n\n---\n\n`Resolver` Methods:\n\n- resolver.[**and**](doc\u002Fresolver.md)(options)\n- resolver.[**or**](doc\u002Fresolver.md)(options)\n- resolver.[**xor**](doc\u002Fresolver.md)(options)\n- resolver.[**not**](doc\u002Fresolver.md)(options)\n- resolver.[**boost**](doc\u002Fresolver.md)(number)\n- resolver.[**limit**](doc\u002Fresolver.md)(number)\n- resolver.[**offset**](doc\u002Fresolver.md)(number)\n- resolver.[**resolve**](doc\u002Fresolver.md)(\\\u003Coptions\\>)\n\n`Resolver` Properties:\n\n- resolver.[**result**](doc\u002Fresolver.md)\n- resolver.[**await**](doc\u002Fresolver.md) (Async)\n\n---\n\n`StorageInterface` Methods:\n\n- \u003Csmall>_async_\u003C\u002Fsmall> db.[**mount**](doc\u002Fpersistent.md)(index, \\\u003Coptions\\>)\n- \u003Csmall>_async_\u003C\u002Fsmall> db.[**open**](doc\u002Fpersistent.md)()\n- \u003Csmall>_async_\u003C\u002Fsmall> db.[**close**](doc\u002Fpersistent.md)()\n- \u003Csmall>_async_\u003C\u002Fsmall> db.[**destroy**](doc\u002Fpersistent.md)()\n- \u003Csmall>_async_\u003C\u002Fsmall> db.[**clear**](doc\u002Fpersistent.md)()\n- \u003Csmall>_async_\u003C\u002Fsmall> db.[**commit**](doc\u002Fpersistent.md)(index)\n\n---\n\n`Charset` Universal Encoder Preset:\n\n- Charset.[**Exact**](#charset-collection)\n- Charset.[**Default**](#charset-collection)\n- Charset.[**Normalize**](#charset-collection)\n\n`Charset` Latin-specific Encoder Preset:\n\n- Charset.[**LatinBalance**](#charset-collection)\n- Charset.[**LatinAdvanced**](#charset-collection)\n- Charset.[**LatinExtra**](#charset-collection)\n- Charset.[**LatinSoundex**](#charset-collection)\n\n`Charset` Chinese, Japanese, Korean Encoder Preset:\n\n- Charset.[**CJK**](#charset-collection)\n\n---\n\n`Language` Encoder Preset:\n- [**en**](doc\u002Fencoder.md#built-in-language-packs)\n- [**de**](doc\u002Fencoder.md#built-in-language-packs)\n- [**fr**](doc\u002Fencoder.md#built-in-language-packs)\n\n## Basic Usage\n\n#### Create a new index\n\n```js\nconst index = new Index();\n```\n\nCreate a new index and choosing one of the [Presets](#presets):\n\n```js\nconst index = new Index(\"match\");\n```\n\nCreate a new index with custom options:\n\n```js\nconst index = new Index({\n    tokenize: \"forward\"\n});\n```\n\nCreate a new index and extend a preset with custom options:\n\n```js\nvar index = new FlexSearch({\n    preset: \"memory\",\n    tokenize: \"forward\",\n    resolution: 5\n});\n```\n\nCreate a new index and assign an [Encoder](doc\u002Fencoder.md):\n\n```js\nimport { Charset } from \"flexsearch\";\nconst index = new Index({\n    tokenize: \"forward\",\n    encoder: Charset.LatinBalance\n});\n```\n\nRelated Topics: [Index Options](#index-options) \n&ensp;&bull;&ensp; [Resolution](#resolution)\n&ensp;&bull;&ensp; [Charset Collection](#charset-collection)\n&ensp;&bull;&ensp; [Tokenizer](#tokenizer-partial-match)\n\n#### Add text item to an index\n\nEvery content which should be added to the index needs an ID. When your content has no ID, then you need to create one by passing an index or count or something else as an ID (a value from type `number` is highly recommended). Those IDs are unique references to a given content. This is important when you update or adding over content through existing IDs. When referencing is not a concern, you can simply use something simple like `count++`.\n\n> Index.__add(id, string)__\n\n```js\nindex.add(0, \"John Doe\");\n```\n\n#### Search items\n\n> Index.__search(string | options, \\\u003Climit\\>, \\\u003Coptions\\>)__\n\n```js\nindex.search(\"John\");\n```\n\nLimit the result:\n\n```js\nindex.search(\"John\", 10);\n```\n\n#### Check existence of already indexed IDs\n\nYou can check if an ID was already indexed by:\n\n```js\nif(index.contain(1)){\n    console.log(\"ID was found in index\");\n}\n```\n\n#### Update item from an index\n\n> Index.__update(id, string)__\n\n```js\nindex.update(0, \"Max Miller\");\n```\n\n#### Remove item from an index\n\n> Index.__remove(id)__\n\n```js\nindex.remove(0);\n```\n\n#### Clear all items from an index\n\n> Index.__clear()__\n\n```js\nindex.clear();\n```\n\n### Chaining\n\nSimply chain methods like:\n\n```js\nconst index = new Index().addMatcher({'â': 'a'}).add(0, 'foo').add(1, 'bar');\n```\n\n```js\nindex.remove(0).update(1, 'foo').add(2, 'foobar');\n```\n\n## Index Options\n\n\u003Ctable>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>Option\u003C\u002Ftd>\n        \u003Ctd>Values\u003C\u002Ftd>\n        \u003Ctd>Description\u003C\u002Ftd>\n        \u003Ctd>Default\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>preset\u003C\u002Ftd>\n        \u003Ctd>\n            \"memory\"\u003Cbr>\n            \"performance\"\u003Cbr>\n            \"match\"\u003Cbr>\n            \"score\"\u003Cbr>\n            \"default\"\n        \u003C\u002Ftd>\n        \u003Ctd>\n            The \u003Ca href=\"#presets\">configuration profile\u003C\u002Fa> as a shortcut or as a base for your custom settings.\u003Cbr>\n        \u003C\u002Ftd>\n        \u003Ctd>\"default\"\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>tokenize\u003C\u002Ftd>\n        \u003Ctd>\n            \"strict\" \u002F \"exact\"\u003Cbr>\n            \"tolerant\"\u003Cbr>\n            \"forward\"\u003Cbr>\n            \"reverse\" \u002F \"bidirectional\u003Cbr>\n            \"full\"\n        \u003C\u002Ftd>\n        \u003Ctd>\n            Indicates how terms should be indexed by \u003Ca href=\"#tokenizer-partial-match\">tokenization\u003C\u002Fa>.\n        \u003C\u002Ftd>\n        \u003Ctd>\"strict\"\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>resolution\u003C\u002Ftd>\n        \u003Ctd>\n            Number\n        \u003C\u002Ftd>\n        \u003Ctd>Sets the scoring \u003Ca href=\"#resolution\">resolution\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>9\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>encoder\u003C\u002Ftd>\n        \u003Ctd>\n            \u003Ca href=\"doc\u002Fencoder.md\">new Encoder(options)\u003C\u002Fa>\u003Cbr>\n            Charset.Exact\u003Cbr>\n            Charset.Default\u003Cbr>\n            Charset.Normalize\u003Cbr>\n            Charset.LatinBalance\u003Cbr>\n            Charset.LatinAdvanced\u003Cbr>\n            Charset.LatinExtra\u003Cbr>\n            Charset.LatinSoundex\u003Cbr>\n            Charset.CJK\u003Cbr>\n            false\n        \u003C\u002Ftd>\n        \u003Ctd>Choose one of the \u003Ca href=\"#charset-collection\">built-in encoder\u003C\u002Fa>\u003Cbr>Read more about \u003Ca href=\"doc\u002Fencoder.md\">Encoder\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\"default\"\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>encode\u003C\u002Ftd>\n        \u003Ctd>\n            function(string) => string[]\n        \u003C\u002Ftd>\n        \u003Ctd>Pass a \u003Ca href=\"doc\u002Fencoder.md#custom-encoder\">custom encoding function\u003C\u002Fa>\u003Cbr>Read more about \u003Ca href=\"doc\u002Fencoder.md\">Encoder\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\"default\"\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>context\u003C\u002Ftd>\n        \u003Ctd>\n            Boolean\u003Cbr>\n            \u003Ca href=\"#context-options\">Context Options\u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>Enable\u002FDisable \u003Ca href=\"#context-search\">context index\u003C\u002Fa>. When passing \"true\" as a value will use the defaults for the context.\u003C\u002Ftd>\n        \u003Ctd>false\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>cache\u003C\u002Ftd>\n        \u003Ctd>\n            Boolean\u003Cbr>\n            Number\n        \u003C\u002Ftd>\n        \u003Ctd>Enable\u002FDisable and\u002For set capacity of cached entries.\u003Cbr>\u003Cbr>The cache automatically balance stored entries related to their popularity.\u003C\u002Ftd>\n        \u003Ctd>false\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>fastupdate\u003C\u002Ftd>\n        \u003Ctd>\n            Boolean\n        \u003C\u002Ftd>\n        \u003Ctd>Additionally add a \u003Ca href=\"#fastupdate\">fastupdate index\u003C\u002Fa> which boost any replace\u002Fupdate\u002Fremove task to a high performance level by also increasing index size by ~30%.\u003C\u002Ftd>\n        \u003Ctd>false\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>priority\u003C\u002Ftd>\n        \u003Ctd>\n            Number\n        \u003C\u002Ftd>\n        \u003Ctd>Sets the task execution priority (1 low priority - 9 high priority) when using the \u003Ca href=\"doc\u002Fasync.md\">async methods\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>4\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>score\u003C\u002Ftd>\n        \u003Ctd>\n            function(string) => number\n        \u003C\u002Ftd>\n        \u003Ctd>Use a \u003Ca href=\"doc\u002Fcustomization.md\">custom score function\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>keystore\u003C\u002Ftd>\n        \u003Ctd>\n            Number\n        \u003C\u002Ftd>\n        \u003Ctd>Increase available size for In-Memory-Index by additionally using uniform balanced registers (\u003Ca href=\"doc\u002Fkeystore.md\">Keystore\u003C\u002Fa>). You can apply values from 1 to 64.\u003C\u002Ftd>\n        \u003Ctd>false\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd colspan=\"4\">\n            Persistent Options:\n        \u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>db\u003C\u002Ftd>\n        \u003Ctd>\n            StorageInterface\n        \u003C\u002Ftd>\n        \u003Ctd>Pass an instance of a \u003Ca href=\"doc\u002Fpersistent.md\">persistent adapter\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>commit\u003C\u002Ftd>\n        \u003Ctd>\n            Boolean\n        \u003C\u002Ftd>\n        \u003Ctd>When disabled any changes won't commit, instead it needs calling \u003Ccode>index.commit()\u003C\u002Fcode> manually to make modifications to the index (add, update, remove) persistent.\u003C\u002Ftd>\n        \u003Ctd>true\u003C\u002Ftd>\n    \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## Search Options\n\n\u003Ctable>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>Option\u003C\u002Ftd>\n        \u003Ctd>Values\u003C\u002Ftd>\n        \u003Ctd>Description\u003C\u002Ftd>\n        \u003Ctd>Default\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>limit\u003C\u002Ftd>\n        \u003Ctd>number\u003C\u002Ftd>\n        \u003Ctd>Sets the limit of results\u003C\u002Ftd>\n        \u003Ctd>100\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>offset\u003C\u002Ftd>\n        \u003Ctd>number\u003C\u002Ftd>\n        \u003Ctd>Apply offset (skip items)\u003C\u002Ftd>\n        \u003Ctd>0\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>resolution\u003C\u002Ftd>\n        \u003Ctd>number\u003C\u002Ftd>\n        \u003Ctd>Limit the resolution (score) of the results\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>suggest\u003C\u002Ftd>\n        \u003Ctd>Boolean\u003C\u002Ftd>\n        \u003Ctd>Enables \u003Ca href=\"#suggestions\">Suggestions\u003C\u002Fa> in results\u003C\u002Ftd>\n        \u003Ctd>false\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>cache\u003C\u002Ftd>\n        \u003Ctd>Boolean\u003C\u002Ftd>\n        \u003Ctd>Use a \u003Ca href=\"#auto-balanced-cache-by-popularity\">Query Cache\u003C\u002Fa>\u003C\u002Ftd>\n        \u003Ctd>false\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>resolve\u003C\u002Ftd>\n        \u003Ctd>Boolean\u003C\u002Ftd>\n        \u003Ctd>When set to \u003Ccode>false\u003C\u002Fcode>, an instance of a \u003Ca href=\"doc\u002Fresolver.md\">Resolver\u003C\u002Fa> is returned to apply further operations\u003C\u002Ftd>\n        \u003Ctd>true\u003C\u002Ftd>\n    \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## Suggestions\n\nAny query on each of the index types is supporting the option `suggest: true`. Also within some of the `Resolver` stages (and, not, xor) you can add this option for the same purpose.\n\nWhen suggestions is enabled, it allows results which does not perfectly match to the given query e.g. when one term was not included. Suggestion-Search will keep track of the scoring, therefore the first result entry is the closest one to a perfect match.\n\n```js\nconst index = new Index().add(1, \"cat dog bird\");\nconst result = index.search(\"cat fish\");\n\u002F\u002F result => []\n```\n\nSame query with suggestion enabled:\n\n```js\nconst result = index.search(\"cat fish\", { suggest: true });\n\u002F\u002F result => [ 1 ]\n```\n\nAt least one match (or partial match) has to be found to get back any result:\n\n```js\nconst result = index.search(\"horse fish\", { suggest: true });\n\u002F\u002F result => []\n```\n\n## Resolution\n\nThe resolution refers to the maximum count of scoring slots on which the content is divided into.\n\n> A formula to determine a well-balanced value for the `resolution` is: $2*floor(\\sqrt{content.length})$ where content is the largest value pushed by `index.add()`. This formula does not apply to the `context` resolution.\n\nA resolution of 1 will disable scoring, when `context` was not enabled.\nA suggested minimum meaningful resolution is 3, because the first and last slot are reserved when available.\n\n### Context Resolution\n\nWhen `context` was enabled the minimum valuable resolution is 1.\nYou can adjust the resolution of the context index independently.\nGiving both a value of 1 will disable scoring by term position related to the document root.\nInstead, the scoring refers to the distance between each term within the query.\n\nAlthough using a resolution > 1 can further improve context scoring. The default resolution still matters when context chain breaks and falls back to default index internally. A context resolution higher than 50% of the default resolution is probably too much.\n\n## Tokenizer (Partial Match)\n\nThe tokenizer is one of the most important options and heavily influence:\n\n1. required memory \u002F storage\n2. capabilities of partial matches\n\n> [!TIP]\n> If you want getting back results of an indexed term \"flexsearch\" when just typing \"flex\" or \"search\" then this is done by choosing a tokenizer.\n\nTry to choose the most upper of these tokenizer which covers your requirements:\n\n\u003Ctable>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>Option\u003C\u002Ftd>\n        \u003Ctd>Description\u003C\u002Ftd>\n        \u003Ctd>Example\u003C\u002Ftd>\n        \u003Ctd>Memory Factor (n = length of term)\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>\"strict\"\u003C\u002Fcode>\u003Cbr>\u003Ccode>\"exact\"\u003C\u002Fcode>\u003Cbr>\u003Ccode>\"default\"\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>index the full term\u003C\u002Ftd>\n        \u003Ctd>\u003Ccode>foobar\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>\"forward\"\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>index term in forward direction (supports right-to-left by Index option \u003Ccode>rtl: true\u003C\u002Fcode>)\u003C\u002Ftd>\n        \u003Ctd>\u003Ccode>fo\u003C\u002Fcode>obar\u003Cbr>\u003Ccode>foob\u003C\u002Fcode>ar\u003Cbr>\u003C\u002Ftd>\n        \u003Ctd>n\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>\"reverse\"\u003C\u002Fcode>\u003Cbr>\u003Ccode>\"bidirectional\"\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>index term in both directions\u003C\u002Ftd>\n        \u003Ctd>\u003Ccode>fo\u003C\u002Fcode>obar\u003Cbr>\u003Ccode>foob\u003C\u002Fcode>ar\u003Cbr>foob\u003Ccode>ar\u003C\u002Fcode>\u003Cbr>fo\u003Ccode>obar\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>2n - 1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>\"tolerant\"\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>index the full term by also being tolerant against typos like swapped letters and missing letters\u003C\u002Ftd>\n        \u003Ctd>\u003Ccode>foobra\u003C\u002Fcode>\u003Cbr>\u003Ccode>foboar\u003C\u002Fcode>\u003Cbr>\u003Ccode>foobr\u003C\u002Fcode>\u003Cbr>\u003Ccode>fooba\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>2(n - 2) + 2\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>\"full\"\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>index every consecutive partial\u003C\u002Ftd>\n        \u003Ctd>fo\u003Ccode>oba\u003C\u002Fcode>r\u003Cbr>f\u003Ccode>oob\u003C\u002Fcode>ar\u003C\u002Ftd>\n        \u003Ctd>n * (n - 1)\u003C\u002Ftd>\n    \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## Charset Collection\n\nEncoding is one of the most important task and heavily influence:\n\n1. required memory \u002F storage\n2. capabilities of phonetic matches (Fuzzy-Search)\n\n\u003Ctable>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>Option\u003C\u002Ftd>\n        \u003Ctd>Description\u003C\u002Ftd>\n        \u003Ctd>Charset Type\u003C\u002Ftd>\n        \u003Ctd>Compression Ratio\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>Exact\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>Bypass encoding and take exact input\u003C\u002Ftd>\n        \u003Ctd>Universal (multi-lang)\u003C\u002Ftd>\n        \u003Ctd>0%\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>Normalize\u003C\u002Fcode>\u003Cbr>\u003Ccode>Default\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>Case in-sensitive encoding\u003Cbr>Charset normalization\u003Cbr>Letter deduplication\u003C\u002Ftd>\n        \u003Ctd>Universal (multi-lang)\u003C\u002Ftd>\n        \u003Ctd>~ 7%\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>LatinBalance\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>Case in-sensitive encoding\u003Cbr>Charset normalization\u003Cbr>Letter deduplication\u003Cbr>Phonetic basic transformation\u003C\u002Ftd>\n        \u003Ctd>Latin\u003C\u002Ftd>\n        \u003Ctd>~ 30%\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>LatinAdvanced\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>Case in-sensitive encoding\u003Cbr>Charset normalization\u003Cbr>Letter deduplication\u003Cbr>Phonetic advanced transformation\u003C\u002Ftd>\n        \u003Ctd>Latin\u003C\u002Ftd>\n        \u003Ctd>~ 45%\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>LatinExtra\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>Case in-sensitive encoding\u003Cbr>Charset normalization\u003Cbr>Letter deduplication\u003Cbr>Soundex-like transformation\u003C\u002Ftd>\n        \u003Ctd>Latin\u003C\u002Ftd>\n        \u003Ctd>~ 60%\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>LatinSoundex\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>Full Soundex transformation\u003C\u002Ftd>\n        \u003Ctd>Latin\u003C\u002Ftd>\n        \u003Ctd>~ 70%\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>\u003Ccode>function(str) => [str]\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>Pass a custom encoding function to the \u003Ccode>Encoder\u003C\u002Fcode>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## Fuzzy-Search\n\nFlexSearch provides several methods to achieve fuzziness to make queries more tolerant:\n\n1. Use a tokenizer: `tolerant`, `forward`, `reverse` or `full`\n2. Consider using any of the builtin encoder `normalize` > `balance` > `advanced` > `extra` > `soundex` (sorted by fuzziness)\n3. Use one of the language-specific presets e.g. `\u002Flang\u002Fen.js` for en-US specific content\n4. Enable suggestions by passing the search option `suggest: true`\n\nAdditionally, you can apply custom `Mapper`, `Replacer`, `Stemmer`, `Filter` or by assigning a custom `normalize(str)`, `prepare(str)` or `finalize(arr)` function to the Encoder.\n\n### Compare Built-In Encoder Preset\n\nOriginal term which was indexed: \"Struldbrugs\"\n\n\u003Ctable>\n    \u003Ctr>\n        \u003Cth align=\"left\">Encoder:\u003C\u002Fth>\n        \u003Cth>\u003Ccode>Exact\u003C\u002Fcode>\u003C\u002Fth>\n        \u003Cth>\u003Ccode>Normalize (Default)\u003C\u002Fcode>\u003C\u002Fth>\n        \u003Cth>\u003Ccode>LatinBalance\u003C\u002Fcode>\u003C\u002Fth>\n        \u003Cth>\u003Ccode>LatinAdvanced\u003C\u002Fcode>\u003C\u002Fth>\n        \u003Cth>\u003Ccode>LatinExtra\u003C\u002Fcode>\u003C\u002Fth>\n        \u003Cth>\u003Ccode>LatinSoundex\u003C\u002Fcode>\u003C\u002Fth>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Cth align=\"left\">Index Size\u003C\u002Fth>\n        \u003Cth>3.1 Mb\u003C\u002Fth>\n        \u003Cth>1.9 Mb\u003C\u002Fth>\n        \u003Cth>1.7 Mb\u003C\u002Fth>\n        \u003Cth>1.6 Mb\u003C\u002Fth>\n        \u003Cth>1.1 Mb\u003C\u002Fth>\n        \u003Cth>0.7 Mb\u003C\u002Fth>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd align=\"left\">Struldbrugs\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd align=\"left\">strũlldbrųĝgs\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd align=\"left\">strultbrooks\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd align=\"left\">shtruhldbrohkz\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd align=\"left\">zdroltbrykz\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd align=\"left\">struhlbrogger\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>\u003C\u002Ftd>\n        \u003Ctd>✓\u003C\u002Ftd>\n    \u003C\u002Ftr>\n\u003C\u002Ftable>\n\nThe index size was measured after indexing the book \"Gulliver's Travels\".\n\n## Fast-Update Mode\n\nThe default mode is highly optimized for search performance and adding contents to the index. Whenever you need to `update` or `remove` existing contents of an index you can enable an additional register that boosts those tasks also to a high-performance level. This register will take an extra amount of memory (~30% increase of index size).\n\n```js\nconst index = new Index({\n  fastupdate: true\n});\n```\n```js\nconst index = new Document({\n  fastupdate: true\n});\n```\n\n> `Persistent`-Index does not support the `fastupdate` option, because of its nature.\n\nWhen using `fastupdate: true`, the index won't fully clear up, when removing items. A barely rest of structure will still remain. It's not a memory issue, because this rest will take less than 1% of the index size. But instead the internal performance of key lookups will lose efficiency, because of not used (empty) keys in the index.\n\nIn most cases this is not an issue. But you can trigger a `index.cleanup()` task, which will find those empty index slots and remove them:\n\n```js\nindex.cleanup();\n```\n\n> The `cleanup` method has no effect when not using `fastupdate: true`.\n\n## Context Search\n\nThe basic idea of this concept is to limit relevance by its context instead of calculating relevance through the whole distance of its corresponding document. The context acts like a bidirectional moving window of 2 pointers (terms) which can initially have a maximum distance of the value passed via option setting `depth` and dynamically growth on search when the query did not match any results.\n\n\u003Cp align=\"center\">\n    \u003Cbr>\n    \u003Cimg src=\"doc\u002Fcontext-index.svg\" width=\"100%\" style=\"max-width: 700px;\" alt=\"FlexSearch Context-based Scoring (Full-text Search)\">\n\u003C\u002Fp>\n\n### Enable Context-Search\n\nCreate an index and use the default context:\n```js\nvar index = new FlexSearch({\n    tokenize: \"strict\",\n    context: true\n});\n```\n\nCreate an index and apply custom options for the context:\n```js\nvar index = new FlexSearch({\n    tokenize: \"strict\",\n    context: { \n        resolution: 5,\n        depth: 3,\n        bidirectional: true\n    }\n});\n```\n\n> Only the tokenizer `strict` is actually supported by the context index.\n\n> The context index requires \u003Ca href=\"#memory\">additional amount of memory\u003C\u002Fa> depending on passed property `depth`.\n\n### Compare Context Search\n\nPay attention to the numbers \"1\", \"2\" and \"3\":\n\n```js\nconst index = new Index();\nindex.add(1, \"1 A B C D 2 E F G H I 3 J K L\");\nindex.add(2, \"A B C D E F G H I J 1 2 3 K L\");\nconst result = index.search(\"1 2 3\");\n\u002F\u002F --> [1, 2]\n```\n\nSame example with context enabled:\n\n```js\nconst index = new Index({ context: true });\nindex.add(1, \"1 A B C D 2 E F G H I 3 J K L\");\nindex.add(2, \"A B C D E F G H I J 1 2 3 K L\");\nconst result = index.search(\"1 2 3\");\n\u002F\u002F --> [2, 1]\n```\n\nThe first index returns ID 1 in the first slot for the best pick, because matched terms are closer to the document root. The 2nd index has context enabled and returns the ID 2 in the first slot, because of the shorter distance between terms.\n\n### Context Options\n\n\u003Ctable>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>Option\u003C\u002Ftd>\n        \u003Ctd>Values\u003C\u002Ftd>\n        \u003Ctd>Description\u003C\u002Ftd>\n        \u003Ctd>Default\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>resolution\u003C\u002Ftd>\n        \u003Ctd>\n            Number\n        \u003C\u002Ftd>\n        \u003Ctd>Sets the scoring \u003Ca href=\"#resolution\">resolution\u003C\u002Fa> for the context.\u003C\u002Ftd>\n        \u003Ctd>3\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>depth\u003Cbr>\u003Cbr>\u003C\u002Ftd>\n        \u003Ctd>\n            false\u003Cbr>\n            Number\n        \u003C\u002Ftd>\n        \u003Ctd>Enable\u002FDisable context index and also sets the maximum initial distance of related terms.\u003C\u002Ftd>\n        \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd>bidirectional\u003C\u002Ftd>\n        \u003Ctd>\n            Boolean\n        \u003C\u002Ftd>\n        \u003Ctd>If enabled the context direction (aka \"context chain\") can move bidirectional. You should ony disable this options when you need a more exact match with fewer results.\u003C\u002Ftd>\n        \u003Ctd>true\u003C\u002Ftd>\n    \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## Auto-Balanced Cache (By Popularity)\n\nYou need to initialize the cache and its limit of available cache slots during the creation of the index:\n\n```js\nconst index = new Index({ cache: 100 });\n```\n\n> The method `.searchCache(query)` is available for each type of index.\n\n```js\nconst results = index.searchCache(query);\n```\n\n> The cache automatically balance stored entries related to their popularity.\n\nThe cache also stores latest queries. A common scenario is an autocomplete or instant search when typing.\n\n## Index Memory Allocation\n\nThe book \"Gulliver's Travels\" (Swift Jonathan 1726) was indexed for this test.\n\nby default a lexical index is very small:\u003Cbr>\n`depth: 0, bidirectional: 0, resolution: 3, minlength: 0` => 2.1 Mb\n\na higher resolution will increase the memory allocation:\u003Cbr>\n`depth: 0, bidirectional: 0, resolution: 9, minlength: 0` => 2.9 Mb\n\nusing the contextual index will increase the memory allocation:\u003Cbr>\n`depth: 1, bidirectional: 0, resolution: 9, minlength: 0` => 12.5 Mb\n\na higher contextual depth will increase the memory allocation:\u003Cbr>\n`depth: 2, bidirectional: 0, resolution: 9, minlength: 0` => 21.5 Mb\n\na higher minlength will decrease memory allocation:\u003Cbr>\n`depth: 2, bidirectional: 0, resolution: 9, minlength: 3` => 19.0 Mb\n\nusing bidirectional will decrease memory allocation:\u003Cbr>\n`depth: 2, bidirectional: 1, resolution: 9, minlength: 3` => 17.9 Mb\n\nenable the option \"fastupdate\" will increase memory allocation:\u003Cbr>\n`depth: 2, bidirectional: 1, resolution: 9, minlength: 3` => 6.3 Mb\n\n## Presets\n\n1. `memory` primarily optimized for a small memory footprint\n2. `performance` primarily optimized for high performance\n3. `match` primarily optimized for matching capabilities\n4. `score` primarily optimized for scoring capabilities (order of results)\n5. `default` the default balanced profile\n\nThese profiles are covering standard use cases. It is recommended to apply custom configuration instead of using profiles to get the best out. Every profile could be optimized further to its specific task, e.g. extreme performance optimized configuration or extreme memory and so on.\n\nYou can pass a preset during creation\u002Finitialization of the index.\n\n## Best Practices\n\n### Page-Load \u002F Fast-Boot\n\nThere are several options to optimize either the page load or when booting up or populate an index on server-side:\n\n- Using [Fast-Boot Serialization](doc\u002Fexport-import.md#fast-boot-serialization-for-server-side-rendering-php-python-ruby-rust-java-go-nodejs-) for small and simple indexes\n- Using [Non-Blocking Runtime Balancer (Async)](doc\u002Fasync.md) for populating larger amounts of contents while doing other processes in parallel\n- Using [Worker Indexes](doc\u002Fworker.md) will distribute the workload to dedicated balanced threads\n- Using [Persistent Indexes](doc\u002Fpersistent.md) when targeting a zero-latency boot-up\n\n### Use numeric IDs\n\nIt is recommended to use id values from type `number` as reference when adding content to the index. The reserved byte length of passed ids influences the memory consumption significantly. When stringified numeric IDs are included in your datasets consider replacing these by `parseInt(...)` before pushing to the index.\n\n---\n\nCopyright 2018-2025 Thomas Wilkerling, Hosted by Nextapps GmbH\u003Cbr>\nReleased under the \u003Ca href=\"http:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0.html\" target=\"_blank\">Apache 2.0 License\u003C\u002Fa>\u003Cbr>\n","FlexSearch 是一个适用于浏览器和 Node.js 的下一代全文搜索库。它支持模糊搜索、文档搜索、标签搜索以及结果高亮等功能，具有高性能和低资源消耗的特点。该库使用 JavaScript 编写，并且可以利用 Web Worker 在后台线程中执行搜索任务，从而提高前端应用的响应速度。FlexSearch 适合需要在客户端或服务器端实现快速文本搜索功能的各种场景，如网站内搜索、日志分析等。","2026-06-11 02:53:55","top_language"]