mirror of
https://github.com/JockeTF/fimfareader.git
synced 2024-11-27 07:28:00 +01:00
Sort and filter results by Tantivy score
This commit is contained in:
parent
c6a9e88834
commit
1291c4933a
2 changed files with 33 additions and 16 deletions
|
@ -49,25 +49,36 @@ fn main() {
|
||||||
|
|
||||||
while let Ok(line) = editor.readline(">>> ") {
|
while let Ok(line) = editor.readline(">>> ") {
|
||||||
editor.add_history_entry(&line);
|
editor.add_history_entry(&line);
|
||||||
|
|
||||||
let filter = searcher.parse(&line);
|
|
||||||
|
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
let stories = fetcher.filter(&filter);
|
|
||||||
|
let result = searcher
|
||||||
|
.search(&line)
|
||||||
|
.into_iter()
|
||||||
|
.filter(|(_sid, score)| *score > 10f32)
|
||||||
|
.filter_map(|(sid, score)| Some((fetcher.fetch(sid)?, score)))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
let finish = (Instant::now() - start).as_millis();
|
let finish = (Instant::now() - start).as_millis();
|
||||||
let count = stories.len();
|
let count = result.len();
|
||||||
|
|
||||||
println!("Found {} stories in {} milliseconds!", count, finish);
|
println!("Found {} stories in {} milliseconds!", count, finish);
|
||||||
|
|
||||||
if count > 32 {
|
for (story, score) in result {
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for story in stories.iter() {
|
|
||||||
let key = &story.id;
|
let key = &story.id;
|
||||||
let title = &story.title;
|
let title = &story.title;
|
||||||
|
|
||||||
println!("[{}] {}", key, title);
|
let tags = story
|
||||||
|
.tags
|
||||||
|
.iter()
|
||||||
|
.map(|tag| String::from(&tag.name))
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ");
|
||||||
|
|
||||||
|
println!("{:02.02}% [{:>6}] {}", score, key, title);
|
||||||
|
println!("{}", tags);
|
||||||
|
println!("{}", story.short_description);
|
||||||
|
println!("{}", story.url);
|
||||||
|
println!();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,7 +125,7 @@ impl Searcher {
|
||||||
println!("Index generated in {} seconds.", finish);
|
println!("Index generated in {} seconds.", finish);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse(&self, text: &str) -> impl Fn(&Story) -> bool + Sync {
|
pub fn search(&self, text: &str) -> Vec<(i64, f32)> {
|
||||||
let reader = self
|
let reader = self
|
||||||
.index
|
.index
|
||||||
.reader_builder()
|
.reader_builder()
|
||||||
|
@ -138,12 +138,11 @@ impl Searcher {
|
||||||
let content = self.schema.get_field("content").unwrap();
|
let content = self.schema.get_field("content").unwrap();
|
||||||
let parser = QueryParser::for_index(&self.index, vec![content]);
|
let parser = QueryParser::for_index(&self.index, vec![content]);
|
||||||
|
|
||||||
let limit = TopDocs::with_limit(16);
|
let limit = TopDocs::with_limit(32);
|
||||||
let query = parser.parse_query(&text).unwrap();
|
let query = parser.parse_query(&text).unwrap();
|
||||||
let docs = searcher.search(&query, &limit).unwrap();
|
let docs = searcher.search(&query, &limit).unwrap();
|
||||||
|
|
||||||
let mut sids: Vec<i64> = docs
|
docs.into_iter()
|
||||||
.into_iter()
|
|
||||||
.map(|(score, address)| {
|
.map(|(score, address)| {
|
||||||
let doc = searcher.doc(address).unwrap();
|
let doc = searcher.doc(address).unwrap();
|
||||||
|
|
||||||
|
@ -152,7 +151,14 @@ impl Searcher {
|
||||||
_ => panic!("Invalid story key type!"),
|
_ => panic!("Invalid story key type!"),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.filter(|(_, score)| *score > 0.1)
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn parse(&self, text: &str) -> impl Fn(&Story) -> bool + Sync {
|
||||||
|
let mut sids: Vec<_> = self
|
||||||
|
.search(text)
|
||||||
|
.into_iter()
|
||||||
|
.filter(|(_, score)| *score > 10f32)
|
||||||
.map(|(sid, _)| sid)
|
.map(|(sid, _)| sid)
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue