delegating the search logic to a query trait.

This commit is contained in:
Paul Masurel
2016-06-12 16:22:40 +09:00
parent 97edf1f5cb
commit 3d8cd078d1
8 changed files with 173 additions and 27 deletions

View File

@@ -223,6 +223,7 @@ mod tests {
use core::searcher::DocAddress;
use collector::FastFieldTestCollector;
use collector::TestCollector;
use query::MultiTermQuery;
use schema::TextIndexingOptions;
#[test]
@@ -286,7 +287,8 @@ mod tests {
let searcher = index.searcher().unwrap();
let get_doc_ids = |terms: Vec<Term>| {
let mut collector = TestCollector::new();
assert!(searcher.search(&terms, &mut collector).is_ok());
let query = MultiTermQuery::new(terms);
assert!(searcher.search(&query, &mut collector).is_ok());
collector.docs()
};
{
@@ -329,8 +331,9 @@ mod tests {
}
{
let get_fast_vals = |terms: Vec<Term>| {
let query = MultiTermQuery::new(terms);
let mut collector = FastFieldTestCollector::for_field(score_field);
assert!(searcher.search(&terms, &mut collector).is_ok());
assert!(searcher.search(&query, &mut collector).is_ok());
collector.vals().clone()
};
assert_eq!(

View File

@@ -96,7 +96,7 @@ impl SegmentReader {
SegmentPostings::from_data(term_info.doc_freq, &postings_data)
}
fn get_term<'a>(&'a self, term: &Term) -> Option<TermInfo> {
pub fn get_term<'a>(&'a self, term: &Term) -> Option<TermInfo> {
self.term_infos.get(term.as_slice())
}

View File

@@ -2,11 +2,12 @@ use core::reader::SegmentReader;
use core::index::Index;
use core::index::Segment;
use DocId;
use schema::{Document, Term};
use schema::Document;
use collector::Collector;
use std::io;
use common::TimerTree;
use postings::Postings;
use query::Query;
#[derive(Debug)]
pub struct Searcher {
@@ -40,6 +41,10 @@ impl Searcher {
segments: Vec::new(),
}
}
pub fn segments(&self,) -> &Vec<SegmentReader> {
&self.segments
}
pub fn for_index(index: Index) -> io::Result<Searcher> {
let mut searcher = Searcher::new();
@@ -48,27 +53,31 @@ impl Searcher {
}
Ok(searcher)
}
pub fn search<C: Collector>(&self, terms: &Vec<Term>, collector: &mut C) -> io::Result<TimerTree> {
let mut timer_tree = TimerTree::new();
{
let mut search_timer = timer_tree.open("search");
for (segment_ord, segment) in self.segments.iter().enumerate() {
let mut segment_search_timer = search_timer.open("segment_search");
{
let _ = segment_search_timer.open("set_segment");
try!(collector.set_segment(segment_ord as SegmentLocalId, &segment));
}
let mut postings = segment.search(terms, segment_search_timer.open("get_postings"));
{
let _collection_timer = segment_search_timer.open("collection");
while postings.next() {
collector.collect(postings.doc());
}
}
}
}
Ok(timer_tree)
pub fn search<Q: Query, C: Collector>(&self, query: &Q, collector: &mut C) -> io::Result<TimerTree> {
query.search(self, collector)
}
// pub fn search<C: Collector>(&self, terms: &Vec<Term>, collector: &mut C) -> io::Result<TimerTree> {
// let mut timer_tree = TimerTree::new();
// {
// let mut search_timer = timer_tree.open("search");
// for (segment_ord, segment) in self.segments.iter().enumerate() {
// let mut segment_search_timer = search_timer.open("segment_search");
// {
// let _ = segment_search_timer.open("set_segment");
// try!(collector.set_segment(segment_ord as SegmentLocalId, &segment));
// }
// let mut postings = segment.search(terms, segment_search_timer.open("get_postings"));
// {
// let _collection_timer = segment_search_timer.open("collection");
// while postings.next() {
// collector.collect(postings.doc());
// }
// }
// }
// }
// Ok(timer_tree)
// }
}