2024-06-11 16:03:45 +02:00
|
|
|
use meili_snap::{json_string, snapshot};
|
|
|
|
|
|
|
|
use crate::common::{GetAllDocumentsOptions, Server};
|
|
|
|
use crate::json;
|
|
|
|
use crate::vector::generate_default_user_provided_documents;
|
|
|
|
|
|
|
|
#[actix_rt::test]
|
|
|
|
async fn update_embedder() {
|
|
|
|
let server = Server::new().await;
|
|
|
|
let index = server.index("doggo");
|
|
|
|
let (value, code) = server.set_features(json!({"vectorStore": true})).await;
|
|
|
|
snapshot!(code, @"200 OK");
|
|
|
|
snapshot!(value, @r###"
|
|
|
|
{
|
|
|
|
"vectorStore": true,
|
|
|
|
"metrics": false,
|
2024-07-09 11:15:57 +02:00
|
|
|
"logsRoute": false,
|
2024-07-17 11:13:37 +02:00
|
|
|
"editDocumentsByFunction": false,
|
|
|
|
"containsFilter": false
|
2024-06-11 16:03:45 +02:00
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
|
|
|
let (response, code) = index
|
|
|
|
.update_settings(json!({
|
|
|
|
"embedders": { "manual": {}},
|
|
|
|
}))
|
|
|
|
.await;
|
|
|
|
snapshot!(code, @"202 Accepted");
|
|
|
|
server.wait_task(response.uid()).await;
|
|
|
|
|
|
|
|
let (response, code) = index
|
|
|
|
.update_settings(json!({
|
|
|
|
"embedders": {
|
|
|
|
"manual": {
|
|
|
|
"source": "userProvided",
|
|
|
|
"dimensions": 2,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
}))
|
|
|
|
.await;
|
|
|
|
snapshot!(code, @"202 Accepted");
|
|
|
|
|
|
|
|
let ret = server.wait_task(response.uid()).await;
|
|
|
|
snapshot!(ret, @r###"
|
|
|
|
{
|
2024-07-31 17:57:32 +02:00
|
|
|
"uid": "[uid]",
|
2024-06-11 16:03:45 +02:00
|
|
|
"indexUid": "doggo",
|
2024-06-12 14:49:38 +02:00
|
|
|
"status": "succeeded",
|
2024-06-11 16:03:45 +02:00
|
|
|
"type": "settingsUpdate",
|
|
|
|
"canceledBy": null,
|
|
|
|
"details": {
|
|
|
|
"embedders": {
|
|
|
|
"manual": {
|
|
|
|
"source": "userProvided",
|
|
|
|
"dimensions": 2
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2024-06-12 14:49:38 +02:00
|
|
|
"error": null,
|
2024-06-11 16:03:45 +02:00
|
|
|
"duration": "[duration]",
|
|
|
|
"enqueuedAt": "[date]",
|
|
|
|
"startedAt": "[date]",
|
|
|
|
"finishedAt": "[date]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[actix_rt::test]
|
|
|
|
async fn reset_embedder_documents() {
|
|
|
|
let server = Server::new().await;
|
|
|
|
let index = generate_default_user_provided_documents(&server).await;
|
|
|
|
|
|
|
|
let (response, code) = index.delete_settings().await;
|
|
|
|
snapshot!(code, @"202 Accepted");
|
|
|
|
server.wait_task(response.uid()).await;
|
|
|
|
|
|
|
|
// Make sure the documents are still present
|
2024-06-13 17:16:41 +02:00
|
|
|
let (documents, _code) = index
|
|
|
|
.get_all_documents(GetAllDocumentsOptions {
|
|
|
|
limit: None,
|
|
|
|
offset: None,
|
|
|
|
retrieve_vectors: false,
|
|
|
|
fields: None,
|
|
|
|
})
|
|
|
|
.await;
|
|
|
|
snapshot!(json_string!(documents), @r###"
|
|
|
|
{
|
|
|
|
"results": [
|
|
|
|
{
|
|
|
|
"id": 0,
|
|
|
|
"name": "kefir"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 1,
|
|
|
|
"name": "echo"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 2,
|
|
|
|
"name": "billou"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 3,
|
|
|
|
"name": "intel"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 4,
|
|
|
|
"name": "max"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"offset": 0,
|
|
|
|
"limit": 20,
|
|
|
|
"total": 5
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
|
|
|
// Make sure we are still able to retrieve their vectors
|
|
|
|
let (documents, _code) = index
|
|
|
|
.get_all_documents(GetAllDocumentsOptions { retrieve_vectors: true, ..Default::default() })
|
|
|
|
.await;
|
2024-06-11 16:03:45 +02:00
|
|
|
snapshot!(json_string!(documents), @r###"
|
|
|
|
{
|
|
|
|
"results": [
|
|
|
|
{
|
|
|
|
"id": 0,
|
2024-06-12 18:13:34 +02:00
|
|
|
"name": "kefir",
|
|
|
|
"_vectors": {
|
|
|
|
"manual": {
|
|
|
|
"embeddings": [
|
|
|
|
[
|
|
|
|
0.0,
|
|
|
|
0.0,
|
|
|
|
0.0
|
|
|
|
]
|
|
|
|
],
|
|
|
|
"regenerate": false
|
|
|
|
}
|
|
|
|
}
|
2024-06-11 16:03:45 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 1,
|
2024-06-12 18:13:34 +02:00
|
|
|
"name": "echo",
|
|
|
|
"_vectors": {
|
|
|
|
"manual": {
|
|
|
|
"embeddings": [
|
|
|
|
[
|
|
|
|
1.0,
|
|
|
|
1.0,
|
|
|
|
1.0
|
|
|
|
]
|
|
|
|
],
|
|
|
|
"regenerate": false
|
|
|
|
}
|
|
|
|
}
|
2024-06-11 16:03:45 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 2,
|
2024-06-12 18:13:34 +02:00
|
|
|
"name": "billou",
|
|
|
|
"_vectors": {
|
|
|
|
"manual": {
|
|
|
|
"embeddings": [
|
|
|
|
[
|
|
|
|
2.0,
|
|
|
|
2.0,
|
|
|
|
2.0
|
|
|
|
],
|
|
|
|
[
|
|
|
|
2.0,
|
|
|
|
2.0,
|
|
|
|
3.0
|
|
|
|
]
|
|
|
|
],
|
|
|
|
"regenerate": false
|
|
|
|
}
|
|
|
|
}
|
2024-06-11 16:03:45 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 3,
|
2024-06-12 18:13:34 +02:00
|
|
|
"name": "intel",
|
|
|
|
"_vectors": {
|
|
|
|
"manual": {
|
|
|
|
"embeddings": [
|
|
|
|
[
|
|
|
|
3.0,
|
|
|
|
3.0,
|
|
|
|
3.0
|
|
|
|
]
|
|
|
|
],
|
|
|
|
"regenerate": false
|
|
|
|
}
|
|
|
|
}
|
2024-06-11 16:03:45 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 4,
|
2024-06-12 18:13:34 +02:00
|
|
|
"name": "max",
|
|
|
|
"_vectors": {
|
|
|
|
"manual": {
|
|
|
|
"embeddings": [
|
|
|
|
[
|
|
|
|
4.0,
|
|
|
|
4.0,
|
|
|
|
4.0
|
|
|
|
],
|
|
|
|
[
|
|
|
|
4.0,
|
|
|
|
4.0,
|
|
|
|
5.0
|
|
|
|
]
|
|
|
|
],
|
|
|
|
"regenerate": false
|
|
|
|
}
|
|
|
|
}
|
2024-06-11 16:03:45 +02:00
|
|
|
}
|
|
|
|
],
|
|
|
|
"offset": 0,
|
|
|
|
"limit": 20,
|
|
|
|
"total": 5
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
|
|
|
// Make sure the arroy DB has been cleared
|
|
|
|
let (documents, _code) = index.search_post(json!({ "vector": [1, 1, 1] })).await;
|
|
|
|
snapshot!(json_string!(documents), @r###"
|
|
|
|
{
|
|
|
|
"message": "Cannot find embedder with name `default`.",
|
|
|
|
"code": "invalid_embedder",
|
|
|
|
"type": "invalid_request",
|
|
|
|
"link": "https://docs.meilisearch.com/errors#invalid_embedder"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
}
|