mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-08-02 03:40:00 +00:00
Apply a few optimisations for graph-based ranking rules
This commit is contained in:
@ -1,40 +1,54 @@
|
||||
use std::collections::HashSet;
|
||||
|
||||
use super::{Edge, RankingRuleGraph, RankingRuleGraphTrait};
|
||||
use crate::new::small_bitmap::SmallBitmap;
|
||||
use crate::new::{QueryGraph, SearchContext};
|
||||
use crate::Result;
|
||||
use roaring::RoaringBitmap;
|
||||
|
||||
impl<G: RankingRuleGraphTrait> RankingRuleGraph<G> {
|
||||
pub fn build(ctx: &mut SearchContext, query_graph: QueryGraph) -> Result<Self> {
|
||||
let mut ranking_rule_graph =
|
||||
Self { query_graph, all_edges: vec![], node_edges: vec![], successors: vec![] };
|
||||
let QueryGraph { nodes: graph_nodes, edges: graph_edges, .. } = &query_graph;
|
||||
|
||||
for (node_idx, node) in ranking_rule_graph.query_graph.nodes.iter().enumerate() {
|
||||
ranking_rule_graph.node_edges.push(RoaringBitmap::new());
|
||||
ranking_rule_graph.successors.push(RoaringBitmap::new());
|
||||
let new_edges = ranking_rule_graph.node_edges.last_mut().unwrap();
|
||||
let new_successors = ranking_rule_graph.successors.last_mut().unwrap();
|
||||
let mut all_edges = vec![];
|
||||
let mut node_edges = vec![];
|
||||
let mut successors = vec![];
|
||||
|
||||
for (node_idx, node) in graph_nodes.iter().enumerate() {
|
||||
node_edges.push(HashSet::new());
|
||||
successors.push(HashSet::new());
|
||||
let new_edges = node_edges.last_mut().unwrap();
|
||||
let new_successors = successors.last_mut().unwrap();
|
||||
|
||||
let Some(from_node_data) = G::build_visit_from_node(ctx, node)? else { continue };
|
||||
|
||||
for successor_idx in ranking_rule_graph.query_graph.edges[node_idx].successors.iter() {
|
||||
let to_node = &ranking_rule_graph.query_graph.nodes[successor_idx as usize];
|
||||
for successor_idx in graph_edges[node_idx].successors.iter() {
|
||||
let to_node = &graph_nodes[successor_idx as usize];
|
||||
let mut edges = G::build_visit_to_node(ctx, to_node, &from_node_data)?;
|
||||
if edges.is_empty() {
|
||||
continue;
|
||||
}
|
||||
edges.sort_by_key(|e| e.0);
|
||||
for (cost, details) in edges {
|
||||
ranking_rule_graph.all_edges.push(Some(Edge {
|
||||
from_node: node_idx as u32,
|
||||
all_edges.push(Some(Edge {
|
||||
from_node: node_idx as u16,
|
||||
to_node: successor_idx,
|
||||
cost,
|
||||
details,
|
||||
}));
|
||||
new_edges.insert(ranking_rule_graph.all_edges.len() as u32 - 1);
|
||||
new_edges.insert(all_edges.len() as u16 - 1);
|
||||
new_successors.insert(successor_idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(ranking_rule_graph)
|
||||
let node_edges = node_edges
|
||||
.into_iter()
|
||||
.map(|edges| SmallBitmap::from_iter(edges.into_iter(), all_edges.len() as u16))
|
||||
.collect();
|
||||
let successors = successors
|
||||
.into_iter()
|
||||
.map(|edges| SmallBitmap::from_iter(edges.into_iter(), all_edges.len() as u16))
|
||||
.collect();
|
||||
|
||||
Ok(RankingRuleGraph { query_graph, all_edges, node_edges, successors })
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user