mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-07-22 22:30:58 +00:00
Compare commits
21 Commits
Author | SHA1 | Date | |
---|---|---|---|
fc8182d7d3 | |||
4f87465f18 | |||
5f1586ae85 | |||
8d3161a2cf | |||
8bc8214279 | |||
3ea5aa18a2 | |||
c4845b78a9 | |||
530e913e2f | |||
5917f212ba | |||
d2b1690191 | |||
710b7ea091 | |||
089579d835 | |||
7780293ddb | |||
773a51e7d0 | |||
7923752513 | |||
9a48091b21 | |||
30cb60f679 | |||
08687d8dab | |||
3a90233a3d | |||
32483cae2d | |||
d7f28e0260 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@
|
||||
**/*.rs.bk
|
||||
/*.mdb
|
||||
/query-history.txt
|
||||
/data.ms
|
||||
|
20
Cargo.lock
generated
20
Cargo.lock
generated
@ -880,7 +880,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "meilisearch-core"
|
||||
version = "0.8.2"
|
||||
version = "0.8.4"
|
||||
dependencies = [
|
||||
"arc-swap 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -897,9 +897,9 @@ dependencies = [
|
||||
"indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"levenshtein_automata 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"meilisearch-schema 0.8.2",
|
||||
"meilisearch-tokenizer 0.8.2",
|
||||
"meilisearch-types 0.8.2",
|
||||
"meilisearch-schema 0.8.4",
|
||||
"meilisearch-tokenizer 0.8.4",
|
||||
"meilisearch-types 0.8.4",
|
||||
"once_cell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ordered-float 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustyline 5.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -917,7 +917,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "meilisearch-http"
|
||||
version = "0.8.2"
|
||||
version = "0.8.4"
|
||||
dependencies = [
|
||||
"async-compression 0.1.0-alpha.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -930,8 +930,8 @@ dependencies = [
|
||||
"jemallocator 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"main_error 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"meilisearch-core 0.8.2",
|
||||
"meilisearch-schema 0.8.2",
|
||||
"meilisearch-core 0.8.4",
|
||||
"meilisearch-schema 0.8.4",
|
||||
"pretty-bytes 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -953,7 +953,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "meilisearch-schema"
|
||||
version = "0.8.2"
|
||||
version = "0.8.4"
|
||||
dependencies = [
|
||||
"bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -964,7 +964,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "meilisearch-tokenizer"
|
||||
version = "0.8.2"
|
||||
version = "0.8.4"
|
||||
dependencies = [
|
||||
"deunicode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"slice-group-by 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -972,7 +972,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "meilisearch-types"
|
||||
version = "0.8.2"
|
||||
version = "0.8.4"
|
||||
dependencies = [
|
||||
"serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"zerocopy 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -23,5 +23,5 @@ RUN apk add libgcc
|
||||
|
||||
COPY --from=compiler /meilisearch/target/release/meilisearch .
|
||||
|
||||
ENV MEILI_HTTP_ADDR 0.0.0.0:8080
|
||||
ENV MEILI_HTTP_ADDR 0.0.0.0:7700
|
||||
CMD ./meilisearch
|
||||
|
113
README.md
113
README.md
@ -7,8 +7,12 @@
|
||||
⚡ Ultra relevant and instant full-text search API 🔍
|
||||
|
||||
MeiliSearch is a powerful, fast, open-source, easy to use, and deploy search engine. The search and indexation are fully customizable and handles features like typo-tolerance, filters, and synonyms.
|
||||
For more [details about those features, go to our documentation](https://docs.meilisearch.com/).
|
||||
|
||||
## What MeiliSearch has to offer
|
||||
[](https://crates.meilisearch.com)
|
||||
> Meili helps the Rust community find crates on [crates.meilisearch.com](https://crates.meilisearch.com)
|
||||
|
||||
## Features
|
||||
* Search as-you-type experience (answers < 50ms)
|
||||
* Full-text search
|
||||
* Typo tolerant (understands typos and spelling mistakes)
|
||||
@ -17,64 +21,48 @@ MeiliSearch is a powerful, fast, open-source, easy to use, and deploy search eng
|
||||
* Easy to install, deploy, and maintain
|
||||
* Whole documents returned
|
||||
* Highly customizable
|
||||
* RESTfull API
|
||||
|
||||
For more [details about those features, go to our documentation](https://docs.meilisearch.com/introduction/features.html).
|
||||
|
||||
[](https://crates.meilisearch.com)
|
||||
|
||||
> Meili helps the Rust community find crates on [crates.meilisearch.com](https://crates.meilisearch.com)
|
||||
|
||||
### In-depth features
|
||||
|
||||
- Provides [6 default ranking criteria](https://github.com/meilisearch/MeiliSearch/blob/dc5c42821e1340e96cb90a3da472264624a26326/meilisearch-core/src/criterion/mod.rs#L107-L113) used to [bucket sort](https://en.wikipedia.org/wiki/Bucket_sort) documents
|
||||
- Accepts [custom criteria](https://github.com/meilisearch/MeiliSearch/blob/dc5c42821e1340e96cb90a3da472264624a26326/meilisearch-core/src/criterion/mod.rs#L24-L33) and can apply them in any custom order
|
||||
- Support [ranged queries](https://github.com/meilisearch/MeiliSearch/blob/dc5c42821e1340e96cb90a3da472264624a26326/meilisearch-core/src/query_builder.rs#L283), useful for paginating results
|
||||
- Can [distinct](https://github.com/meilisearch/MeiliSearch/blob/dc5c42821e1340e96cb90a3da472264624a26326/meilisearch-core/src/query_builder.rs#L265-L270) and [filter](https://github.com/meilisearch/MeiliSearch/blob/dc5c42821e1340e96cb90a3da472264624a26326/meilisearch-core/src/query_builder.rs#L246-L259) returned documents based on context defined rules
|
||||
- Searches for [concatenated](https://github.com/meilisearch/MeiliSearch/pull/164) and [splitted query words](https://github.com/meilisearch/MeiliSearch/pull/232) to improve the search quality.
|
||||
- Can store complete documents or only [user schema specified fields](https://github.com/meilisearch/MeiliSearch/blob/dc5c42821e1340e96cb90a3da472264624a26326/meilisearch-schema/src/lib.rs#L265-L279)
|
||||
- The [default tokenizer](https://github.com/meilisearch/MeiliSearch/blob/dc5c42821e1340e96cb90a3da472264624a26326/meilisearch-tokenizer/src/lib.rs) can index latin and kanji based languages
|
||||
- Returns [the matching text areas](https://github.com/meilisearch/MeiliSearch/blob/dc5c42821e1340e96cb90a3da472264624a26326/meilisearch-core/src/lib.rs#L66-L88), useful to highlight matched words in results
|
||||
- Accepts query time search config like the [searchable attributes](https://github.com/meilisearch/MeiliSearch/blob/dc5c42821e1340e96cb90a3da472264624a26326/meilisearch-core/src/query_builder.rs#L272-L275)
|
||||
- Supports [runtime incremental indexing](https://github.com/meilisearch/MeiliSearch/blob/dc5c42821e1340e96cb90a3da472264624a26326/meilisearch-core/src/store/mod.rs#L143-L173)
|
||||
|
||||
* RESTfull API
|
||||
|
||||
## Quick Start
|
||||
|
||||
You can deploy your instant, relevant, and typo-tolerant MeiliSearch search engine by yourself too.
|
||||
Something similar to the demo above can be achieved by following these little three steps first.
|
||||
You still need to create your front-end to make it pretty, though.
|
||||
|
||||
### Deploy the Server
|
||||
|
||||
If you have not yet installed Rust and its package manager `cargo`, go to [the installation page](https://www.rust-lang.org/tools/install).<br/>
|
||||
You can deploy the server on your machine; it listens to HTTP requests on the 8080 port by default.
|
||||
|
||||
```bash
|
||||
# If you have the Rust toolchain already installed, you can compile from the source
|
||||
git clone https://github.com/meilisearch/MeiliSearch.git
|
||||
cd MeiliSearch
|
||||
cargo run --release
|
||||
```
|
||||
|
||||
For more logs during the execution, run:
|
||||
```bash
|
||||
RUST_LOG=info cargo run --release
|
||||
# You can also use Docker
|
||||
docker run -it -p 7700:7700 --rm getmeili/MeiliSearch
|
||||
|
||||
# You can also download the binary
|
||||
curl -L https://install.meilisearch.com | sh
|
||||
./meilisearch
|
||||
```
|
||||
|
||||
### Create an Index and Upload Some Documents
|
||||
|
||||
We provide a movie dataset that you can use for testing purposes.
|
||||
|
||||
```bash
|
||||
curl -L 'https://bit.ly/33MKvk4' -o movies.json
|
||||
```
|
||||
|
||||
MeiliSearch can serve multiple indexes, with different kinds of documents,
|
||||
therefore, it is required to create the index before sending documents to it.
|
||||
|
||||
```bash
|
||||
curl -i -X POST 'http://127.0.0.1:8080/indexes' --data '{ "name": "Movies", "uid": "movies" }'
|
||||
curl -i -X POST 'http://127.0.0.1:7700/indexes' --data '{ "name": "Movies", "uid": "movies" }'
|
||||
```
|
||||
|
||||
Now that the server knows about our brand new index, we can send it data.
|
||||
We provided you a small dataset that is available in the `datasets/` directory.
|
||||
|
||||
```bash
|
||||
curl -i -X POST 'http://127.0.0.1:8080/indexes/movies/documents' \
|
||||
curl -i -X POST 'http://127.0.0.1:7700/indexes/movies/documents' \
|
||||
--header 'content-type: application/json' \
|
||||
--data @datasets/movies/movies.json
|
||||
--data-binary @movies.json
|
||||
```
|
||||
|
||||
### Search for Documents
|
||||
@ -83,34 +71,57 @@ The search engine is now aware of our documents and can serve those via our HTTP
|
||||
The [`jq` command-line tool](https://stedolan.github.io/jq/) can significantly help you read the server responses.
|
||||
|
||||
```bash
|
||||
curl 'http://127.0.0.1:8080/indexes/movies/search?q=botman'
|
||||
curl 'http://127.0.0.1:7700/indexes/movies/search?q=botman+robin&limit=2' | jq
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"hits": [
|
||||
{
|
||||
"id": "29751",
|
||||
"title": "Batman Unmasked: The Psychology of the Dark Knight",
|
||||
"poster": "https://image.tmdb.org/t/p/w1280/jjHu128XLARc2k4cJrblAvZe0HE.jpg",
|
||||
"overview": "Delve into the world of Batman and the vigilante justice tha",
|
||||
"release_date": "2008-07-15"
|
||||
"id": "415",
|
||||
"title": "Batman & Robin",
|
||||
"poster": "https://image.tmdb.org/t/p/w1280/79AYCcxw3kSKbhGpx1LiqaCAbwo.jpg",
|
||||
"overview": "Along with crime-fighting partner Robin and new recruit Batgirl...",
|
||||
"release_date": "1997-06-20",
|
||||
},
|
||||
{
|
||||
"id": "471474",
|
||||
"title": "Batman: Gotham by Gaslight",
|
||||
"poster": "https://image.tmdb.org/t/p/w1280/7souLi5zqQCnpZVghaXv0Wowi0y.jpg",
|
||||
"overview": "ve Victorian Age Gotham City, Batman begins his war on crime",
|
||||
"release_date": "2018-01-12"
|
||||
"id": "411736",
|
||||
"title": "Batman: Return of the Caped Crusaders",
|
||||
"poster": "https://image.tmdb.org/t/p/w1280/GW3IyMW5Xgl0cgCN8wu96IlNpD.jpg",
|
||||
"overview": "Adam West and Burt Ward returns to their iconic roles of Batman and Robin...",
|
||||
"release_date": "2016-10-08",
|
||||
}
|
||||
],
|
||||
"offset": 0,
|
||||
"limit": 2,
|
||||
"processingTimeMs": 1,
|
||||
"query": "botman"
|
||||
"query": "botman robin"
|
||||
}
|
||||
```
|
||||
|
||||
### Documentation
|
||||
|
||||
Now, that you have a running MeiliSearch, you can learn more and tune your search engine using [the documentation](https://docs.meilisearch.com).
|
||||
|
||||
## How it works
|
||||
|
||||
MeiliSearch uses [LMDB](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database) as the internal key-value store. The key-value store allows us to handle updates and queries with small memory and CPU overheads. The whole ranking system is [data oriented](https://github.com/meilisearch/MeiliSearch/issues/82) and provides great performances.
|
||||
|
||||
You can [read the deep dive](deep-dive.md) if you want more information on the engine; it describes the whole process of generating updates and handling queries. Also, you can take a look at the [typos and ranking rules](typos-ranking-rules.md) if you want to know the default rules used to sort the documents.
|
||||
|
||||
### Technical features
|
||||
|
||||
- Provides [6 default ranking criteria](https://github.com/meilisearch/MeiliSearch/blob/3ea5aa18a209b6973b921542d46a79e1c753c163/meilisearch-core/src/criterion/mod.rs#L106-L111) used to [bucket sort](https://en.wikipedia.org/wiki/Bucket_sort) documents
|
||||
- Accepts [custom criteria](https://github.com/meilisearch/MeiliSearch/blob/3ea5aa18a209b6973b921542d46a79e1c753c163/meilisearch-core/src/criterion/mod.rs#L20-L29) and can apply them in any custom order
|
||||
- Support [ranged queries](https://github.com/meilisearch/MeiliSearch/blob/3ea5aa18a209b6973b921542d46a79e1c753c163/meilisearch-core/src/query_builder.rs#L342), useful for paginating results
|
||||
- Can [distinct](https://github.com/meilisearch/MeiliSearch/blob/3ea5aa18a209b6973b921542d46a79e1c753c163/meilisearch-core/src/query_builder.rs#L324-L329) and [filter](https://github.com/meilisearch/MeiliSearch/blob/3ea5aa18a209b6973b921542d46a79e1c753c163/meilisearch-core/src/query_builder.rs#L313-L318) returned documents based on context defined rules
|
||||
- Searches for [concatenated](https://github.com/meilisearch/MeiliSearch/pull/164) and [splitted query words](https://github.com/meilisearch/MeiliSearch/pull/232) to improve the search quality.
|
||||
- Can store complete documents or only [user schema specified fields](https://github.com/meilisearch/MeiliSearch/blob/3ea5aa18a209b6973b921542d46a79e1c753c163/datasets/movies/schema.toml)
|
||||
- The [default tokenizer](https://github.com/meilisearch/MeiliSearch/blob/3ea5aa18a209b6973b921542d46a79e1c753c163/meilisearch-tokenizer/src/lib.rs) can index latin and kanji based languages
|
||||
- Returns [the matching text areas](https://github.com/meilisearch/MeiliSearch/blob/3ea5aa18a209b6973b921542d46a79e1c753c163/meilisearch-types/src/lib.rs#L49-L65), useful to highlight matched words in results
|
||||
- Accepts query time search config like the [searchable attributes](https://github.com/meilisearch/MeiliSearch/blob/3ea5aa18a209b6973b921542d46a79e1c753c163/meilisearch-core/src/query_builder.rs#L331-L336)
|
||||
- Supports [runtime incremental indexing](https://github.com/meilisearch/MeiliSearch/blob/3ea5aa18a209b6973b921542d46a79e1c753c163/meilisearch-core/src/store/mod.rs#L143-L212)
|
||||
|
||||
## Performances
|
||||
|
||||
With a dataset composed of _100 353_ documents with _352_ attributes each and _3_ of them indexed.
|
||||
@ -137,12 +148,6 @@ The resulting database was _16 GB_ and search results were between _30 ms_ and _
|
||||
With Rust 1.32 the allocator has been [changed to use the system allocator](https://blog.rust-lang.org/2019/01/17/Rust-1.32.0.html#jemalloc-is-removed-by-default).
|
||||
We have seen much better performances when [using jemalloc as the global allocator](https://github.com/alexcrichton/jemallocator#documentation).
|
||||
|
||||
## How it works
|
||||
|
||||
MeiliSearch uses [LMDB](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database) as the internal key-value store. The key-value store allows us to handle updates and queries with small memory and CPU overheads. The whole ranking system is [data oriented](https://github.com/meilisearch/MeiliSearch/issues/82) and provides excellent great performances.
|
||||
|
||||
You can [read the deep dive](deep-dive.md) if you want more information on the engine; it describes the whole process of generating updates and handling queries. Also, you can take a look at the [typos and ranking rules](typos-ranking-rules.md) if you want to know the default rules used to sort the documents.
|
||||
|
||||
## Contributing
|
||||
|
||||
We will be glad if you submit issues and pull requests. You can help to grow this project and start contributing by checking [issues tagged "good-first-issue"](https://github.com/meilisearch/MeiliSearch/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). It is a good start!
|
||||
|
129
download-latest.sh
Normal file
129
download-latest.sh
Normal file
@ -0,0 +1,129 @@
|
||||
#!/bin/sh
|
||||
|
||||
# COLORS
|
||||
RED="\033[31m"
|
||||
GREEN="\033[32m"
|
||||
DEFAULT="\033[0m"
|
||||
|
||||
# GLOBALS
|
||||
REGEXP_SEMVER='v[^0-9]*\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\)\([0-9A-Za-z-]*\)'
|
||||
BINARY_NAME='meilisearch'
|
||||
|
||||
# semverParseInto and semverLT from https://github.com/cloudflare/semver_bash/blob/master/semver.sh
|
||||
|
||||
# usage: semverParseInto version major minor patch special
|
||||
# version: the string version
|
||||
# major, minor, patch, special: will be assigned by the function
|
||||
semverParseInto() {
|
||||
local RE='[^0-9]*\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\)\([0-9A-Za-z-]*\)'
|
||||
#MAJOR
|
||||
eval $2=`echo $1 | sed -e "s#$RE#\1#"`
|
||||
#MINOR
|
||||
eval $3=`echo $1 | sed -e "s#$RE#\2#"`
|
||||
#MINOR
|
||||
eval $4=`echo $1 | sed -e "s#$RE#\3#"`
|
||||
#SPECIAL
|
||||
eval $5=`echo $1 | sed -e "s#$RE#\4#"`
|
||||
}
|
||||
|
||||
# usage: semverLT version1 version2
|
||||
semverLT() {
|
||||
local MAJOR_A=0
|
||||
local MINOR_A=0
|
||||
local PATCH_A=0
|
||||
local SPECIAL_A=0
|
||||
|
||||
local MAJOR_B=0
|
||||
local MINOR_B=0
|
||||
local PATCH_B=0
|
||||
local SPECIAL_B=0
|
||||
|
||||
semverParseInto $1 MAJOR_A MINOR_A PATCH_A SPECIAL_A
|
||||
semverParseInto $2 MAJOR_B MINOR_B PATCH_B SPECIAL_B
|
||||
|
||||
if [ $MAJOR_A -lt $MAJOR_B ]; then
|
||||
return 0
|
||||
fi
|
||||
if [ $MAJOR_A -le $MAJOR_B ] && [ $MINOR_A -lt $MINOR_B ]; then
|
||||
return 0
|
||||
fi
|
||||
if [ $MAJOR_A -le $MAJOR_B ] && [ $MINOR_A -le $MINOR_B ] && [ $PATCH_A -lt $PATCH_B ]; then
|
||||
return 0
|
||||
fi
|
||||
if [ "_$SPECIAL_A" == "_" ] && [ "_$SPECIAL_B" == "_" ] ; then
|
||||
return 1
|
||||
fi
|
||||
if [ "_$SPECIAL_A" == "_" ] && [ "_$SPECIAL_B" != "_" ] ; then
|
||||
return 1
|
||||
fi
|
||||
if [ "_$SPECIAL_A" != "_" ] && [ "_$SPECIAL_B" == "_" ] ; then
|
||||
return 0
|
||||
fi
|
||||
if [ "_$SPECIAL_A" < "_$SPECIAL_B" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
success_usage() {
|
||||
printf "$GREEN%s\n$DEFAULT" "MeiliSearch binary successfully downloaded as '$BINARY_NAME' file."
|
||||
echo ''
|
||||
echo 'Run it:'
|
||||
echo ' $ ./meilisearch'
|
||||
echo 'Usage:'
|
||||
echo ' $ ./meilisearch --help'
|
||||
}
|
||||
|
||||
failure_usage() {
|
||||
printf "$RED%s\n$DEFAULT" 'ERROR: MeiliSearch binary is not available for your OS distribution yet.'
|
||||
echo ''
|
||||
echo 'However, you can easily compile the binary from the source files.'
|
||||
echo 'Follow the steps on the docs: https://docs.meilisearch.com/advanced_guides/binary.html#how-to-compile-meilisearch'
|
||||
}
|
||||
|
||||
# OS DETECTION
|
||||
echo 'Detecting OS distribution...'
|
||||
os_name=$(uname -s)
|
||||
if [ "$os_name" != "Darwin" ]; then
|
||||
os_name=$(cat /etc/os-release | grep '^ID=' | tr -d '"' | cut -d '=' -f 2)
|
||||
fi
|
||||
echo "OS distribution detected: $os_name"
|
||||
case "$os_name" in
|
||||
'Darwin')
|
||||
os='macos'
|
||||
;;
|
||||
'ubuntu' | 'debian')
|
||||
os='linux'
|
||||
;;
|
||||
*)
|
||||
failure_usage
|
||||
exit 1
|
||||
esac
|
||||
|
||||
# GET LATEST VERSION
|
||||
tags=$(curl -s 'https://api.github.com/repos/meilisearch/MeiliSearch/tags' \
|
||||
| grep "$REGEXP_SEMVER" \
|
||||
| grep 'name' \
|
||||
| tr -d '"' | tr -d ',' | cut -d 'v' -f 2)
|
||||
|
||||
latest=""
|
||||
for tag in $tags; do
|
||||
if [ "$latest" = "" ]; then
|
||||
latest="$tag"
|
||||
else
|
||||
semverLT $tag $latest
|
||||
if [ $? -eq 1 ]; then
|
||||
latest="$tag"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# DOWNLOAD THE LATEST
|
||||
echo "Downloading MeiliSearch binary v$latest for $os..."
|
||||
release_file="meilisearch-$os-amd64"
|
||||
link="https://github.com/meilisearch/MeiliSearch/releases/download/v$latest/$release_file"
|
||||
curl -OL "$link"
|
||||
mv "$release_file" "$BINARY_NAME"
|
||||
chmod 744 "$BINARY_NAME"
|
||||
success_usage
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "meilisearch-core"
|
||||
version = "0.8.2"
|
||||
version = "0.8.4"
|
||||
authors = ["Kerollmops <clement@meilisearch.com>"]
|
||||
edition = "2018"
|
||||
|
||||
@ -17,9 +17,9 @@ hashbrown = { version = "0.6.0", features = ["serde"] }
|
||||
heed = "0.6.0"
|
||||
levenshtein_automata = { version = "0.1.1", features = ["fst_automaton"] }
|
||||
log = "0.4.8"
|
||||
meilisearch-schema = { path = "../meilisearch-schema", version = "0.8.2" }
|
||||
meilisearch-tokenizer = { path = "../meilisearch-tokenizer", version = "0.8.2" }
|
||||
meilisearch-types = { path = "../meilisearch-types", version = "0.8.2" }
|
||||
meilisearch-schema = { path = "../meilisearch-schema", version = "0.8.4" }
|
||||
meilisearch-tokenizer = { path = "../meilisearch-tokenizer", version = "0.8.4" }
|
||||
meilisearch-types = { path = "../meilisearch-types", version = "0.8.4" }
|
||||
once_cell = "1.2.0"
|
||||
ordered-float = { version = "1.0.2", features = ["serde"] }
|
||||
sdset = "0.3.3"
|
||||
|
@ -461,7 +461,7 @@ mod tests {
|
||||
|
||||
let update_reader = db.update_read_txn().unwrap();
|
||||
let result = index.update_status(&update_reader, update_id).unwrap();
|
||||
assert_matches!(result, Some(UpdateStatus::Processed { content }) if content.error.is_some());
|
||||
assert_matches!(result, Some(UpdateStatus::Failed { content }) if content.error.is_some());
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -685,7 +685,7 @@ mod tests {
|
||||
// check if it has been accepted
|
||||
let update_reader = db.update_read_txn().unwrap();
|
||||
let result = index.update_status(&update_reader, update_id).unwrap();
|
||||
assert_matches!(result, Some(UpdateStatus::Processed { content }) if content.error.is_some());
|
||||
assert_matches!(result, Some(UpdateStatus::Failed { content }) if content.error.is_some());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -172,6 +172,7 @@ pub enum UpdateType {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct ProcessedUpdateResult {
|
||||
pub update_id: u64,
|
||||
#[serde(rename = "type")]
|
||||
@ -184,8 +185,10 @@ pub struct ProcessedUpdateResult {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct EnqueuedUpdateResult {
|
||||
pub update_id: u64,
|
||||
#[serde(rename = "type")]
|
||||
pub update_type: UpdateType,
|
||||
pub enqueued_at: DateTime<Utc>,
|
||||
}
|
||||
@ -197,6 +200,10 @@ pub enum UpdateStatus {
|
||||
#[serde(flatten)]
|
||||
content: EnqueuedUpdateResult,
|
||||
},
|
||||
Failed {
|
||||
#[serde(flatten)]
|
||||
content: ProcessedUpdateResult,
|
||||
},
|
||||
Processed {
|
||||
#[serde(flatten)]
|
||||
content: ProcessedUpdateResult,
|
||||
@ -210,7 +217,13 @@ pub fn update_status(
|
||||
update_id: u64,
|
||||
) -> MResult<Option<UpdateStatus>> {
|
||||
match updates_results_store.update_result(update_reader, update_id)? {
|
||||
Some(result) => Ok(Some(UpdateStatus::Processed { content: result })),
|
||||
Some(result) => {
|
||||
if result.error.is_some() {
|
||||
Ok(Some(UpdateStatus::Failed { content: result }))
|
||||
} else {
|
||||
Ok(Some(UpdateStatus::Processed { content: result }))
|
||||
}
|
||||
},
|
||||
None => match updates_store.get(update_reader, update_id)? {
|
||||
Some(update) => Ok(Some(UpdateStatus::Enqueued {
|
||||
content: EnqueuedUpdateResult {
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "meilisearch-http"
|
||||
version = "0.8.2"
|
||||
version = "0.8.4"
|
||||
authors = [
|
||||
"Quentin de Quelen <quentin@dequelen.me>",
|
||||
"Clément Renault <clement@meilisearch.com>",
|
||||
@ -21,8 +21,8 @@ http = "0.1.19"
|
||||
indexmap = { version = "1.3.0", features = ["serde-1"] }
|
||||
log = "0.4.8"
|
||||
main_error = "0.1.0"
|
||||
meilisearch-core = { path = "../meilisearch-core", version = "0.8.2" }
|
||||
meilisearch-schema = { path = "../meilisearch-schema", version = "0.8.2" }
|
||||
meilisearch-core = { path = "../meilisearch-core", version = "0.8.4" }
|
||||
meilisearch-schema = { path = "../meilisearch-schema", version = "0.8.4" }
|
||||
pretty-bytes = "0.2.2"
|
||||
rand = "0.7.2"
|
||||
rayon = "1.2.0"
|
||||
|
@ -3,11 +3,11 @@ use structopt::StructOpt;
|
||||
#[derive(Debug, Clone, StructOpt)]
|
||||
pub struct Opt {
|
||||
/// The destination where the database must be created.
|
||||
#[structopt(long, env = "MEILI_DB_PATH", default_value = "/tmp/meilisearch")]
|
||||
#[structopt(long, env = "MEILI_DB_PATH", default_value = "./data.ms")]
|
||||
pub db_path: String,
|
||||
|
||||
/// The address on which the http server will listen.
|
||||
#[structopt(long, env = "MEILI_HTTP_ADDR", default_value = "127.0.0.1:8080")]
|
||||
#[structopt(long, env = "MEILI_HTTP_ADDR", default_value = "127.0.0.1:7700")]
|
||||
pub http_addr: String,
|
||||
|
||||
/// The master key allowing you to do everything on the server.
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "meilisearch-schema"
|
||||
version = "0.8.2"
|
||||
version = "0.8.4"
|
||||
authors = ["Kerollmops <renault.cle@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "meilisearch-tokenizer"
|
||||
version = "0.8.2"
|
||||
version = "0.8.4"
|
||||
authors = ["Kerollmops <renault.cle@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "meilisearch-types"
|
||||
version = "0.8.2"
|
||||
version = "0.8.4"
|
||||
authors = ["Clément Renault <renault.cle@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
|
Reference in New Issue
Block a user