# Morsels

Easy, relevant, and efficient client-side search for static sites.
## Description
Morsels is a client-side search solution made for static sites, depending on a pre-built index generated by a CLI tool.
Some similar tools in this space are [Stork](https://github.com/jameslittle230/stork) and [TinySearch](https://github.com/tinysearch/tinysearch). Morsels does the same, with a focus on providing a more feature rich and relevant search experience, while remaining easy to get started with for common use cases (e.g. single domain static sites).
<img src="./docs/src/images/light-theme-fullscreen.png" width=500 />
## Features
- **Feature-rich, Relevant Search** 🔍: spelling correction, automatic prefix search, boolean and phrase queries, BM25 scoring, proximity scoring, persistent caching, and more.
- **WebAssembly** & **WebWorker** powered, enabling efficient, non-blocking query processing
- **Multi-threaded** 🏇 CLI indexer powered by Rust
- **Semi-Scalable**, achieved by optionally splitting the index into tiny morsels, and complete with incremental indexing.
- A **customisable**, **accessible** [user interface](https://morsels-search.com/morsels/search_configuration_styling.html) 🖥️
- Support for **multiple file formats** (`.json,csv,pdf,html`) to satisfy more custom data requirements.
## Getting Started
Powering static site search with Morsels is extremely easy, and requires just a folder of your HTML files. Titles, headings, and the rest of the text are automatically sourced from your HTML files. Links to your pages are automatically generated based on how your site's pages are layed out, but it is also possible to override these.
### 1. Installing the indexer
If you have the rust / cargo toolchains setup, simply run `cargo install morsels_indexer --vers 0.6.2`.
Alternatively, download the cli binaries [here](https://github.com/ang-zeyu/morsels/releases).
### 2. Running the indexer
Run the executable as such, replacing `<source-folder-path>` with the relative or absolute folder path of your source html files, and `<output-folder-path>` with your desired index output folder.
```
morsels <source-folder-path> <output-folder-path>
```
### 3. Installing the Search UI via CDN
Add the following resources to your pages:
```html
<script src="https://cdn.jsdelivr.net/gh/ang-zeyu/morsels@v0.6.2/packages/search-ui/dist/search-ui.ascii.bundle.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/ang-zeyu/morsels@v0.6.2/packages/search-ui/dist/search-ui-light.css" />
```
If you wish to host the files, you can find them in the `<output-folder-path>/assets` directory generated by the indexer, or in the [releases](https://github.com/ang-zeyu/morsels/releases) page.
### 4. UI Initialisation
Give any `<input>` element in your page an `id` of `morsels-search`, then call:
```js
initMorsels({
searcherOptions: {
// Output folder url specified as the second parameter in the cli command
// Urls like '/output/' will work as well
url: 'http://<your-domain>/output/',
},
uiOptions: {
// Input / source folder url, specified as the first parameter in the cli command
sourceFilesUrl: 'http://<your-domain>/source/',
}
});
```
## Documentation
The user guide, which also uses Morsels for its search function, can be found [here](https://morsels-search.com/morsels/getting_started.html).
Check out the website [here](https://morsels-search.com) as well!
## License
This project is [MIT licensed](./LICENSE.md).