mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-10-10 13:46:28 +00:00
Fix remote index collision in federated search metadata
- Use composite key (indexUid, remote) instead of indexUid only for remote metadata lookup - Prevents collisions when multiple remotes have same indexUid but different primary keys - Ensures each remote query gets correct primaryKey from its specific remote instance
This commit is contained in:
@@ -126,13 +126,14 @@ pub async fn perform_federated_search(
|
|||||||
let query_metadata = if include_metadata {
|
let query_metadata = if include_metadata {
|
||||||
let mut query_metadata = Vec::new();
|
let mut query_metadata = Vec::new();
|
||||||
|
|
||||||
// Create a map of remote results by index_uid for quick lookup
|
// Create a map of remote results by (index_uid, remote) for quick lookup
|
||||||
let mut remote_results_by_index = std::collections::BTreeMap::new();
|
// This prevents collisions when multiple remotes have the same index_uid but different primary keys
|
||||||
|
let mut remote_results_by_index_and_remote = std::collections::BTreeMap::new();
|
||||||
for remote_result in &remote_results {
|
for remote_result in &remote_results {
|
||||||
if let Some(remote_metadata) = &remote_result.metadata {
|
if let Some(remote_metadata) = &remote_result.metadata {
|
||||||
for remote_meta in remote_metadata {
|
for remote_meta in remote_metadata {
|
||||||
remote_results_by_index
|
let key = (remote_meta.index_uid.clone(), remote_meta.remote.clone());
|
||||||
.insert(remote_meta.index_uid.clone(), remote_meta.clone());
|
remote_results_by_index_and_remote.insert(key, remote_meta.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,7 +152,9 @@ pub async fn perform_federated_search(
|
|||||||
|
|
||||||
if remote.is_some() {
|
if remote.is_some() {
|
||||||
// For remote queries, try to get primary key from remote results
|
// For remote queries, try to get primary key from remote results
|
||||||
if let Some(remote_meta) = remote_results_by_index.get(&index_uid) {
|
// Use composite key (index_uid, remote) to avoid collisions
|
||||||
|
let lookup_key = (index_uid.clone(), remote.clone());
|
||||||
|
if let Some(remote_meta) = remote_results_by_index_and_remote.get(&lookup_key) {
|
||||||
primary_key = remote_meta.primary_key.clone();
|
primary_key = remote_meta.primary_key.clone();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user