Skip to content

Commit 7021789

Browse files
meili-bors[bot]hmacrcurquizaCommanderStormfunlennysub
authored
Merge #682
682: Merge dev into main r=curquiza a=Mubelotix Full changelog after this PR: (includes changes merged before this PR) ## What's Changed ### Breaking changes * Fix deleted_tasks field type in TaskDeletion struct by `@coinmoles` in #666 (`TaskDeletion.deleted_tasks` and `TaskCancelation.canceled_tasks` have been made `Option`s) ### Enhancements * Support all experimental features by `@ellnix` in #656 * Add `usedDatabaseSize` to stats by `@Alirexaa` in #653 * Add facet_search API functionality by `@hmacr` in #512 * Allow users to customize facet value sort behaviour by `@hmacr` in #514 * Support `embedders` setting and other vector/hybrid search related configuration by `@CommanderStorm` in #554 * Add documents and embbedings database metrics to stats response by `@Alirexaa` in #652 * Support facet search and prefix search settings by `@ellnix` in #634 * Serialize for MultiSearchResponse by `@milesgranger` in #668 * Implement federated multi search by `@LukasKalbertodt` in #625 * Add support for similar docs query by `@JiaYingZhang` in #674 ### Maintainance * Remove _md code samples for Mintlify migration by `@curquiza` in #661 * Add missing `exist` to `*_update` functions' docs by `@funlennysub` in #617 * Add Code Coverage GH action by `@Alirexaa` in #654 ## New Contributors * `@Alirexaa` made their first contribution in #653 * `@funlennysub` made their first contribution in #617 * `@milesgranger` made their first contribution in #668 * `@coinmoles` made their first contribution in #666 * `@JiaYingZhang` made their first contribution in #674 **Full Changelog**: v0.28.0...v0.29.0 Co-authored-by: hmacr <[email protected]> Co-authored-by: Clémentine U. - curqui <[email protected]> Co-authored-by: Frank Elsinga <[email protected]> Co-authored-by: Clémentine <[email protected]> Co-authored-by: Vladimir Donich <[email protected]>
2 parents 90a153c + 17545ff commit 7021789

File tree

20 files changed

+2469
-207
lines changed

20 files changed

+2469
-207
lines changed

.code-samples.meilisearch.yaml

Lines changed: 200 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Every example written here will be automatically fetched by
33
# the documentation on build
44
# You can read more on https://github.com/meilisearch/documentation/tree/main/learn
5+
# See the original at https://github.com/meilisearch/documentation/blob/main/.code-samples.meilisearch.yaml
56
---
67
synonyms_guide_1: |-
78
let mut synonyms = std::collections::HashMap::new();
@@ -197,7 +198,7 @@ search_post_1: |-
197198
let results: SearchResults<Movie> = client
198199
.index("movies")
199200
.search()
200-
.with_query("American ninja")
201+
.with_query("american ninja")
201202
.execute()
202203
.await
203204
.unwrap();
@@ -254,6 +255,13 @@ async_guide_filter_by_ids_1: |-
254255
.await
255256
.unwrap();
256257
async_guide_filter_by_statuses_1: |-
258+
let mut query = TasksQuery::new(&client);
259+
let tasks = query
260+
.with_statuses(["failed"])
261+
.execute()
262+
.await
263+
.unwrap();
264+
async_guide_filter_by_statuses_2: |-
257265
let mut query = TasksQuery::new(&client);
258266
let tasks = query
259267
.with_statuses(["failed", "canceled"])
@@ -581,8 +589,12 @@ get_faceting_settings_1: |-
581589
.await
582590
.unwrap();
583591
update_faceting_settings_1: |-
592+
let mut facet_sort_setting = BTreeMap::new();
593+
facet_sort_setting.insert(String::from("*"), FacetSortValue::Alpha);
594+
facet_sort_setting.insert(String::from("genres"), FacetSortValue::Count);
584595
let mut faceting = FacetingSettings {
585596
max_values_per_facet: 2,
597+
sort_facet_values_by: Some(facet_sort_setting),
586598
};
587599
588600
let task: TaskInfo = client
@@ -1265,8 +1277,11 @@ getting_started_sorting: |-
12651277
.await
12661278
.unwrap();
12671279
getting_started_faceting: |-
1280+
let mut facet_sort_setting = BTreeMap::new();
1281+
facet_sort_setting.insert("*".to_string(), FacetSortValue::Count);
12681282
let mut faceting = FacetingSettings {
12691283
max_values_per_facet: 2,
1284+
sort_facet_values_by: Some(facet_sort_setting),
12701285
};
12711286
12721287
let task: TaskInfo = client
@@ -1663,6 +1678,69 @@ reset_proximity_precision_settings_1: |-
16631678
.reset_proximity_precision()
16641679
.await
16651680
.unwrap();
1681+
get_facet_search_settings_1: |-
1682+
let facet_search: bool = client
1683+
.index(INDEX_UID)
1684+
.get_facet_search()
1685+
.await
1686+
.unwrap();
1687+
update_facet_search_settings_1: |-
1688+
let task: TaskInfo = client
1689+
.index(INDEX_UID)
1690+
.set_facet_search(false)
1691+
.await
1692+
.unwrap();
1693+
reset_facet_search_settings_1: |-
1694+
let task: TaskInfo = client
1695+
.index(INDEX_UID)
1696+
.reset_facet_search()
1697+
.await
1698+
.unwrap();
1699+
get_prefix_search_settings_1: |-
1700+
let prefix_search: PrefixSearchSettings = client
1701+
.index(INDEX_UID)
1702+
.get_prefix_search()
1703+
.await
1704+
.unwrap();
1705+
update_prefix_search_settings_1: |-
1706+
let task: TaskInfo = client
1707+
.index(INDEX_UID)
1708+
.set_prefix_search(PrefixSearchSettings::Disabled)
1709+
.await
1710+
.unwrap();
1711+
reset_prefix_search_settings_1: |-
1712+
let task: TaskInfo = client
1713+
.index(INDEX_UID)
1714+
.reset_prefix_search()
1715+
.await
1716+
.unwrap();
1717+
facet_search_1: |-
1718+
let res = client.index("books")
1719+
.facet_search("genres")
1720+
.with_facet_query("fiction")
1721+
.with_filter("rating > 3")
1722+
.execute()
1723+
.await
1724+
.unwrap();
1725+
facet_search_2: |-
1726+
let mut facet_sort_setting = BTreeMap::new();
1727+
facet_sort_setting.insert("genres".to_string(), FacetSortValue::Count);
1728+
let faceting = FacetingSettings {
1729+
max_values_per_facet: 100,
1730+
sort_facet_values_by: Some(facet_sort_setting),
1731+
};
1732+
1733+
let res = client.index("books")
1734+
.set_faceting(&faceting)
1735+
.await
1736+
.unwrap();
1737+
facet_search_3: |-
1738+
let res = client.index("books")
1739+
.facet_search("genres")
1740+
.with_facet_query("c")
1741+
.execute()
1742+
.await
1743+
.unwrap();
16661744
get_search_cutoff_1: |-
16671745
let search_cutoff_ms: String = client
16681746
.index("movies")
@@ -1752,3 +1830,124 @@ reset_localized_attribute_settings_1: |-
17521830
.reset_localized_attributes()
17531831
.await
17541832
.unwrap();
1833+
basic_security_tutorial_listing_1: |-
1834+
let client = Client::new("http://localhost:7700", Some("MASTER_KEY"));
1835+
client
1836+
.get_keys()
1837+
.await
1838+
.unwrap();
1839+
basic_security_tutorial_admin_1: |-
1840+
let client = Client::new("http://localhost:7700", Some("DEFAULT_ADMIN_API_KEY"));
1841+
let task = client
1842+
.create_index("medical_records", Some("id"))
1843+
.await
1844+
.unwrap();
1845+
basic_security_tutorial_search_1: |-
1846+
let client = Client::new("http://localhost:7700", Some("DEFAULT_SEARCH_API_KEY"));
1847+
let index = client.index("medical_records");
1848+
index
1849+
.search()
1850+
.with_query("appointments")
1851+
.execute::<MedicalRecord>()
1852+
.await
1853+
.unwrap();
1854+
get_embedders_1: |-
1855+
let embedders = index.get_embedders().await.unwrap();
1856+
reset_embedders_1: |-
1857+
index.reset_embedders().await.unwrap();
1858+
get_similar_post_1: |-
1859+
let results = index
1860+
.similar_search("TARGET_DOCUMENT_ID", "EMBEDDER_NAME")
1861+
.execute()
1862+
.await
1863+
.unwrap();
1864+
index_settings_tutorial_api_get_setting_1: |-
1865+
let searchable_attributes: Vec<String> = index
1866+
.get_searchable_attributes()
1867+
.await
1868+
.unwrap();
1869+
index_settings_tutorial_api_put_setting_1: |-
1870+
let task = index
1871+
.set_searchable_attributes(["title", "overview"])
1872+
.await
1873+
.unwrap();
1874+
index_settings_tutorial_api_task_1: |-
1875+
let task_status = index.get_task(&task).await.unwrap();
1876+
negative_search_1: |-
1877+
let results = index.search()
1878+
.with_query("-escape")
1879+
.execute()
1880+
.await
1881+
.unwrap();
1882+
negative_search_2: |-
1883+
let results = index.search()
1884+
.with_query("-\"escape room\"")
1885+
.execute()
1886+
.await
1887+
.unwrap();
1888+
related_results_embedder_1: |-
1889+
let embedders = HashMap::from([(
1890+
String::from("movies-text"),
1891+
Embedder {
1892+
source: EmbedderSource::OpenAi,
1893+
api_key: Some(String::from("OPENAI_API_KEY")),
1894+
model: Some(String::from("text-embedding-3-small")),
1895+
document_template: Some(String::from("A movie titled '{{doc.title}}' released in {{ doc.release_date }}. The movie genres are: {{doc.genres}}. The story is about: {{doc.overview|truncatewords: 20}}")),
1896+
..Embedder::default()
1897+
}
1898+
)]);
1899+
movies.set_embedders(&embedders)
1900+
.await
1901+
.unwrap();
1902+
related_results_search_1: |-
1903+
let results = movies.search()
1904+
.with_query("batman")
1905+
.with_hybrid("EMBEDDER_NAME", 0.5)
1906+
.execute()
1907+
.await
1908+
.unwrap();
1909+
related_results_similar_1: |-
1910+
let results = movies.similar_search("192", "EMBEDDER_NAME")
1911+
.execute()
1912+
.await
1913+
.unwrap();
1914+
search_parameter_guide_hybrid_1: |-
1915+
let results = index
1916+
.search()
1917+
.with_query("kitchen utensils")
1918+
.with_hybrid("EMBEDDER_NAME", 0.9)
1919+
.execute()
1920+
.await
1921+
.unwrap();
1922+
search_parameter_guide_vector_1: |-
1923+
let results = index
1924+
.search()
1925+
.with_vector(&[0.0, 1.0, 2.0])
1926+
.with_hybrid("EMBEDDER_NAME", 1.0)
1927+
.execute()
1928+
.await
1929+
.unwrap();
1930+
search_parameter_reference_retrieve_vectors_1: |-
1931+
let results = index
1932+
.search()
1933+
.with_query("kitchen utensils")
1934+
.with_retrieve_vectors(true)
1935+
.with_hybrid("EMBEDDER_NAME", 0.5)
1936+
.execute()
1937+
.await
1938+
.unwrap();
1939+
update_embedders_1: |-
1940+
let embedders = HashMap::from([(
1941+
String::from("default"),
1942+
Embedder {
1943+
source: EmbedderSource::OpenAi,
1944+
api_key: Some(String::from("OPEN_AI_API_KEY")),
1945+
model: Some(String::from("text-embedding-3-small")),
1946+
document_template: Some(String::from("A document titled '{{doc.title}}' whose description starts with {{doc.overview|truncatewords: 20}}")),
1947+
..Embedder::default()
1948+
}
1949+
)]);
1950+
let task = index
1951+
.set_embedders(&embedders)
1952+
.await
1953+
.unwrap();

.github/workflows/tests.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,23 @@ jobs:
8383
uses: ibiqlik/action-yamllint@v3
8484
with:
8585
config_file: .yamllint.yml
86+
87+
coverage:
88+
if: github.actor != 'dependabot[bot]' && !( github.event_name == 'pull_request' && startsWith(github.base_ref, 'bump-meilisearch-v') )
89+
runs-on: ubuntu-latest
90+
needs: integration_tests
91+
name: Code Coverage
92+
steps:
93+
- uses: actions/checkout@v4
94+
- name: Meilisearch (latest version) setup with Docker
95+
run: docker run -d -p 7700:7700 getmeili/meilisearch:latest meilisearch --no-analytics --master-key=masterKey
96+
- name: Install cargo-llvm-cov
97+
uses: taiki-e/install-action@cargo-llvm-cov
98+
- name: Generate code coverage
99+
run: cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info
100+
- name: Upload coverage to Codecov
101+
uses: codecov/codecov-action@v5
102+
with:
103+
token: ${{ secrets.CODECOV_TOKEN }}
104+
files: lcov.info
105+
fail_ci_if_error: true

Cargo.toml

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,29 @@ resolver = "2"
1313
members = ["examples/*"]
1414

1515
[dependencies]
16-
async-trait = "0.1.51"
17-
iso8601 = "0.6.1"
18-
log = "0.4"
16+
async-trait = "0.1.88"
17+
iso8601 = "0.6.3"
18+
log = "0.4.27"
1919
serde = { version = "1.0", features = ["derive"] }
20-
serde_json = "1.0"
21-
time = { version = "0.3.7", features = ["serde-well-known", "formatting", "parsing"] }
20+
serde_json = "1.0.140"
21+
time = { version = "0.3.41", features = ["serde-well-known", "formatting", "parsing"] }
2222
yaup = "0.3.1"
23-
either = { version = "1.8.0", features = ["serde"] }
24-
thiserror = "1.0.37"
25-
meilisearch-index-setting-macro = { path = "meilisearch-index-setting-macro", version = "0.28.0" }
26-
pin-project-lite = { version = "0.2.13", optional = true }
27-
reqwest = { version = "0.12.3", optional = true, default-features = false, features = ["rustls-tls", "http2", "stream"] }
28-
bytes = { version = "1.6", optional = true }
29-
uuid = { version = "1.1.2", features = ["v4"] }
30-
futures-io = "0.3.30"
31-
futures = "0.3"
23+
either = { version = "1.15.0", features = ["serde"] }
24+
thiserror = "2.0.12"
25+
meilisearch-index-setting-macro.path = "meilisearch-index-setting-macro"
26+
pin-project-lite = { version = "0.2.16", optional = true }
27+
reqwest = { version = "0.12.22", optional = true, default-features = false, features = ["rustls-tls", "http2", "stream"] }
28+
bytes = { version = "1.10.1", optional = true }
29+
uuid = { version = "1.17.0", features = ["v4"] }
30+
futures-io = "0.3.31"
31+
futures = "0.3.31"
3232

3333
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
34-
jsonwebtoken = { version = "9", default-features = false }
34+
jsonwebtoken = { version = "9.3.1", default-features = false }
3535

3636
[target.'cfg(target_arch = "wasm32")'.dependencies]
37-
uuid = { version = "1.8.0", default-features = false, features = ["v4", "js"] }
38-
web-sys = "0.3"
37+
uuid = { version = "1.17.0", default-features = false, features = ["v4", "js"] }
38+
web-sys = "0.3.77"
3939
wasm-bindgen-futures = "0.4"
4040

4141
[features]
@@ -46,9 +46,9 @@ futures-unsend = []
4646
[dev-dependencies]
4747
futures-await-test = "0.3"
4848
futures = "0.3"
49-
mockito = "1.0.0"
49+
mockito = "1.0"
5050
meilisearch-test-macro = { path = "meilisearch-test-macro" }
51-
tokio = { version = "1", features = ["rt", "macros"] }
51+
tokio = { version = "1.46", features = ["rt", "macros"] }
5252

5353
# The following dependencies are required for examples
5454
wasm-bindgen = "0.2"

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<a href="https://github.com/meilisearch/meilisearch-rust/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-informational" alt="License"></a>
2525
<a href="https://github.com/meilisearch/meilisearch/discussions" alt="Discussions"><img src="https://img.shields.io/badge/github-discussions-red" /></a>
2626
<a href="https://ms-bors.herokuapp.com/repositories/62"><img src="https://bors.tech/images/badge_small.svg" alt="Bors enabled"></a>
27+
<a href="https://codecov.io/gh/meilisearch/meilisearch-rust"><img src="https://codecov.io/gh/meilisearch/meilisearch-rust/graph/badge.svg?token=NVO9OI8JMG"/></a>
2728
</p>
2829

2930
<p align="center">⚡ The Meilisearch API client written for Rust 🦀</p>

README.tpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<a href="https://github.com/meilisearch/meilisearch-rust/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-informational" alt="License"></a>
2525
<a href="https://github.com/meilisearch/meilisearch/discussions" alt="Discussions"><img src="https://img.shields.io/badge/github-discussions-red" /></a>
2626
<a href="https://ms-bors.herokuapp.com/repositories/62"><img src="https://bors.tech/images/badge_small.svg" alt="Bors enabled"></a>
27+
<a href="https://codecov.io/gh/meilisearch/meilisearch-rust"><img src="https://codecov.io/gh/meilisearch/meilisearch-rust/graph/badge.svg?token=NVO9OI8JMG"/></a>
2728
</p>
2829

2930
<p align="center">⚡ The Meilisearch API client written for Rust 🦀</p>

meilisearch-index-setting-macro/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ repository = "https://github.com/meilisearch/meilisearch-rust"
1212
proc-macro = true
1313

1414
[dependencies]
15-
syn = { version = "2.0.48", features = ["extra-traits"] }
16-
quote = "1.0.21"
17-
proc-macro2 = "1.0.46"
18-
convert_case = "0.6.0"
15+
syn = { version = "2.0.104", features = ["extra-traits"] }
16+
quote = "1.0.40"
17+
proc-macro2 = "1.0.95"
18+
convert_case = "0.8.0"
1919
structmeta = "0.3"

meilisearch-test-macro/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ proc-macro = true
1010
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1111

1212
[dependencies]
13-
proc-macro2 = "1.0.0"
14-
quote = "1.0.0"
15-
syn = { version = "2.0.48", features = ["clone-impls", "full", "parsing", "printing", "proc-macro"], default-features = false }
13+
proc-macro2 = "1.0.95"
14+
quote = "1.0.40"
15+
syn = { version = "2.0.104", features = ["clone-impls", "full", "parsing", "printing", "proc-macro"], default-features = false }

meilisearch-test-macro/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ There are a few rules, though:
6868
- `String`: It returns the name of the test.
6969
- `Client`: It creates a client like that: `Client::new("http://localhost:7700", "masterKey")`.
7070
- `Index`: It creates and deletes an index, as we've seen before.
71+
You can include multiple `Index` parameter to automatically create multiple indexes.
7172

7273
2. You only get what you asked for. That means if you don't ask for an index, no index will be created in meilisearch.
7374
So, if you are testing the creation of indexes, you can ask for a `Client` and a `String` and then create it yourself.

0 commit comments

Comments
 (0)