mirror of
https://github.com/meilisearch/MeiliSearch
synced 2024-11-22 21:04:27 +01:00
Add logger to attribute rr, fix a bug
This commit is contained in:
parent
5acf953298
commit
8edad8291b
@ -50,7 +50,6 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
let docs = execute_search(
|
let docs = execute_search(
|
||||||
&mut ctx,
|
&mut ctx,
|
||||||
&(!query.trim().is_empty()).then(|| query.trim().to_owned()),
|
&(!query.trim().is_empty()).then(|| query.trim().to_owned()),
|
||||||
// what a the from which when there is
|
|
||||||
TermsMatchingStrategy::Last,
|
TermsMatchingStrategy::Last,
|
||||||
false,
|
false,
|
||||||
&None,
|
&None,
|
||||||
|
@ -309,13 +309,14 @@ impl<'ctx> SearchContext<'ctx> {
|
|||||||
let fids = match self.db_cache.word_fids.entry(word) {
|
let fids = match self.db_cache.word_fids.entry(word) {
|
||||||
Entry::Occupied(fids) => fids.get().clone(),
|
Entry::Occupied(fids) => fids.get().clone(),
|
||||||
Entry::Vacant(entry) => {
|
Entry::Vacant(entry) => {
|
||||||
let key = self.word_interner.get(word).as_bytes();
|
let mut key = self.word_interner.get(word).as_bytes().to_owned();
|
||||||
|
key.push(0);
|
||||||
let mut fids = vec![];
|
let mut fids = vec![];
|
||||||
let remap_key_type = self
|
let remap_key_type = self
|
||||||
.index
|
.index
|
||||||
.word_fid_docids
|
.word_fid_docids
|
||||||
.remap_types::<ByteSlice, ByteSlice>()
|
.remap_types::<ByteSlice, ByteSlice>()
|
||||||
.prefix_iter(self.txn, key)?
|
.prefix_iter(self.txn, &key)?
|
||||||
.remap_key_type::<StrBEU16Codec>();
|
.remap_key_type::<StrBEU16Codec>();
|
||||||
for result in remap_key_type {
|
for result in remap_key_type {
|
||||||
let ((_, fid), value) = result?;
|
let ((_, fid), value) = result?;
|
||||||
@ -334,13 +335,14 @@ impl<'ctx> SearchContext<'ctx> {
|
|||||||
let fids = match self.db_cache.word_prefix_fids.entry(word_prefix) {
|
let fids = match self.db_cache.word_prefix_fids.entry(word_prefix) {
|
||||||
Entry::Occupied(fids) => fids.get().clone(),
|
Entry::Occupied(fids) => fids.get().clone(),
|
||||||
Entry::Vacant(entry) => {
|
Entry::Vacant(entry) => {
|
||||||
let key = self.word_interner.get(word_prefix).as_bytes();
|
let mut key = self.word_interner.get(word_prefix).as_bytes().to_owned();
|
||||||
|
key.push(0);
|
||||||
let mut fids = vec![];
|
let mut fids = vec![];
|
||||||
let remap_key_type = self
|
let remap_key_type = self
|
||||||
.index
|
.index
|
||||||
.word_prefix_fid_docids
|
.word_prefix_fid_docids
|
||||||
.remap_types::<ByteSlice, ByteSlice>()
|
.remap_types::<ByteSlice, ByteSlice>()
|
||||||
.prefix_iter(self.txn, key)?
|
.prefix_iter(self.txn, &key)?
|
||||||
.remap_key_type::<StrBEU16Codec>();
|
.remap_key_type::<StrBEU16Codec>();
|
||||||
for result in remap_key_type {
|
for result in remap_key_type {
|
||||||
let ((_, fid), value) = result?;
|
let ((_, fid), value) = result?;
|
||||||
|
@ -11,8 +11,8 @@ use crate::search::new::interner::Interned;
|
|||||||
use crate::search::new::query_graph::QueryNodeData;
|
use crate::search::new::query_graph::QueryNodeData;
|
||||||
use crate::search::new::query_term::LocatedQueryTermSubset;
|
use crate::search::new::query_term::LocatedQueryTermSubset;
|
||||||
use crate::search::new::ranking_rule_graph::{
|
use crate::search::new::ranking_rule_graph::{
|
||||||
Edge, ProximityCondition, ProximityGraph, RankingRuleGraph, RankingRuleGraphTrait,
|
AttributeCondition, AttributeGraph, Edge, ProximityCondition, ProximityGraph, RankingRuleGraph,
|
||||||
TypoCondition, TypoGraph,
|
RankingRuleGraphTrait, TypoCondition, TypoGraph,
|
||||||
};
|
};
|
||||||
use crate::search::new::ranking_rules::BoxRankingRule;
|
use crate::search::new::ranking_rules::BoxRankingRule;
|
||||||
use crate::search::new::{QueryGraph, QueryNode, RankingRule, SearchContext, SearchLogger};
|
use crate::search::new::{QueryGraph, QueryNode, RankingRule, SearchContext, SearchLogger};
|
||||||
@ -29,12 +29,15 @@ pub enum SearchEvents {
|
|||||||
ProximityPaths { paths: Vec<Vec<Interned<ProximityCondition>>> },
|
ProximityPaths { paths: Vec<Vec<Interned<ProximityCondition>>> },
|
||||||
TypoGraph { graph: RankingRuleGraph<TypoGraph> },
|
TypoGraph { graph: RankingRuleGraph<TypoGraph> },
|
||||||
TypoPaths { paths: Vec<Vec<Interned<TypoCondition>>> },
|
TypoPaths { paths: Vec<Vec<Interned<TypoCondition>>> },
|
||||||
|
AttributeGraph { graph: RankingRuleGraph<AttributeGraph> },
|
||||||
|
AttributePaths { paths: Vec<Vec<Interned<AttributeCondition>>> },
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Location {
|
enum Location {
|
||||||
Words,
|
Words,
|
||||||
Typo,
|
Typo,
|
||||||
Proximity,
|
Proximity,
|
||||||
|
Attribute,
|
||||||
Other,
|
Other,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,6 +84,7 @@ impl SearchLogger<QueryGraph> for VisualSearchLogger {
|
|||||||
"words" => Location::Words,
|
"words" => Location::Words,
|
||||||
"typo" => Location::Typo,
|
"typo" => Location::Typo,
|
||||||
"proximity" => Location::Proximity,
|
"proximity" => Location::Proximity,
|
||||||
|
"attribute" => Location::Attribute,
|
||||||
_ => Location::Other,
|
_ => Location::Other,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -152,6 +156,15 @@ impl SearchLogger<QueryGraph> for VisualSearchLogger {
|
|||||||
self.events.push(SearchEvents::ProximityPaths { paths: paths.clone() });
|
self.events.push(SearchEvents::ProximityPaths { paths: paths.clone() });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Location::Attribute => {
|
||||||
|
if let Some(graph) = state.downcast_ref::<RankingRuleGraph<AttributeGraph>>() {
|
||||||
|
self.events.push(SearchEvents::AttributeGraph { graph: graph.clone() });
|
||||||
|
}
|
||||||
|
if let Some(paths) = state.downcast_ref::<Vec<Vec<Interned<AttributeCondition>>>>()
|
||||||
|
{
|
||||||
|
self.events.push(SearchEvents::AttributePaths { paths: paths.clone() });
|
||||||
|
}
|
||||||
|
}
|
||||||
Location::Other => {}
|
Location::Other => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -314,6 +327,10 @@ impl<'ctx> DetailedLoggerFinish<'ctx> {
|
|||||||
SearchEvents::TypoPaths { paths } => {
|
SearchEvents::TypoPaths { paths } => {
|
||||||
self.write_rr_graph_paths::<TypoGraph>(paths)?;
|
self.write_rr_graph_paths::<TypoGraph>(paths)?;
|
||||||
}
|
}
|
||||||
|
SearchEvents::AttributeGraph { graph } => self.write_rr_graph(&graph)?,
|
||||||
|
SearchEvents::AttributePaths { paths } => {
|
||||||
|
self.write_rr_graph_paths::<AttributeGraph>(paths)?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
use std::collections::HashMap;
|
use crate::{index::tests::TempIndex, Criterion, Search, SearchResult, TermsMatchingStrategy};
|
||||||
|
|
||||||
use crate::{
|
|
||||||
index::tests::TempIndex, search::new::tests::collect_field_values, Criterion, Search,
|
|
||||||
SearchResult, TermsMatchingStrategy,
|
|
||||||
};
|
|
||||||
|
|
||||||
fn create_index() -> TempIndex {
|
fn create_index() -> TempIndex {
|
||||||
let index = TempIndex::new();
|
let index = TempIndex::new();
|
||||||
@ -24,21 +19,75 @@ fn create_index() -> TempIndex {
|
|||||||
.add_documents(documents!([
|
.add_documents(documents!([
|
||||||
{
|
{
|
||||||
"id": 0,
|
"id": 0,
|
||||||
"title": "the quick brown fox jumps over the lazy dog",
|
"title": "",
|
||||||
"description": "Pack my box with five dozen liquor jugs",
|
"description": "",
|
||||||
"plot": "How vexingly quick daft zebras jump",
|
"plot": "the quick brown fox jumps over the lazy dog",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"title": "Pack my box with five dozen liquor jugs",
|
"title": "",
|
||||||
"description": "the quick brown foxes jump over the lazy dog",
|
"description": "the quick brown foxes jump over the lazy dog",
|
||||||
"plot": "How vexingly quick daft zebras jump",
|
"plot": "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"title": "How vexingly quick daft zebras jump",
|
"title": "the quick brown fox jumps over the lazy dog",
|
||||||
"description": "Pack my box with five dozen liquor jugs",
|
"description": "",
|
||||||
"plot": "the quick brown fox jumps over the lazy dog",
|
"plot": "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"title": "the",
|
||||||
|
"description": "quick brown fox jumps over the lazy dog",
|
||||||
|
"plot": "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"title": "the quick",
|
||||||
|
"description": "brown fox jumps over the lazy dog",
|
||||||
|
"plot": "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"title": "the quick brown",
|
||||||
|
"description": "fox jumps over the lazy dog",
|
||||||
|
"plot": "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"title": "the quick brown fox",
|
||||||
|
"description": "jumps over the lazy dog",
|
||||||
|
"plot": "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"title": "the quick",
|
||||||
|
"description": "brown fox jumps",
|
||||||
|
"plot": "over the lazy dog",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"title": "the quick brown",
|
||||||
|
"description": "fox",
|
||||||
|
"plot": "jumps over the lazy dog",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"title": "the quick brown",
|
||||||
|
"description": "fox jumps",
|
||||||
|
"plot": "over the lazy dog",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"title": "",
|
||||||
|
"description": "the quick brown fox",
|
||||||
|
"plot": "jumps over the lazy dog",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"title": "the quick",
|
||||||
|
"description": "",
|
||||||
|
"plot": "brown fox jumps over the lazy dog",
|
||||||
}
|
}
|
||||||
]))
|
]))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@ -46,13 +95,14 @@ fn create_index() -> TempIndex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_attributes_are_ranked_correctly() {
|
fn test_attributes_simple() {
|
||||||
let index = create_index();
|
let index = create_index();
|
||||||
|
|
||||||
let txn = index.read_txn().unwrap();
|
let txn = index.read_txn().unwrap();
|
||||||
|
|
||||||
let mut s = Search::new(&txn, &index);
|
let mut s = Search::new(&txn, &index);
|
||||||
s.terms_matching_strategy(TermsMatchingStrategy::All);
|
s.terms_matching_strategy(TermsMatchingStrategy::All);
|
||||||
s.query("the quick brown fox");
|
s.query("the quick brown fox jumps over the lazy dog");
|
||||||
let SearchResult { documents_ids, .. } = s.execute().unwrap();
|
let SearchResult { documents_ids, .. } = s.execute().unwrap();
|
||||||
insta::assert_snapshot!(format!("{documents_ids:?}"), @"[0, 1, 2]");
|
insta::assert_snapshot!(format!("{documents_ids:?}"), @"[2, 6, 5, 4, 3, 9, 7, 8, 11, 10, 0]");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user