Added doc_freq to searcher. Sums the value for all readers.

This commit is contained in:
Paul Masurel
2016-07-05 21:37:35 +09:00
parent 7960a00b99
commit e20acd4ef6
3 changed files with 62 additions and 1 deletions

View File

@@ -8,6 +8,7 @@ use std::io;
use common::TimerTree;
use postings::Postings;
use query::Query;
use schema::Term;
#[derive(Debug)]
pub struct Searcher {
@@ -30,6 +31,13 @@ impl Searcher {
segment_reader.doc(doc_id)
}
pub fn doc_freq(&self, term: &Term) -> u32 {
self.segments
.iter()
.map(|segment_reader| segment_reader.doc_freq(term))
.sum()
}
fn add_segment(&mut self, segment: Segment) -> io::Result<()> {
let segment_reader = try!(SegmentReader::open(segment.clone()));
self.segments.push(segment_reader);

View File

@@ -57,6 +57,13 @@ impl SegmentReader {
}
pub fn doc_freq(&self, term: &Term) -> u32 {
match self.get_term_info(term) {
Some(term_info) => term_info.doc_freq,
None => 0,
}
}
pub fn get_store_reader(&self) -> &StoreReader {
&self.store_reader
}

View File

@@ -2,6 +2,7 @@
#![cfg_attr(test, feature(test))]
#![cfg_attr(test, feature(step_by))]
#![doc(test(attr(allow(unused_variables), deny(warnings))))]
#![feature(iter_arith)]
#[macro_use]
@@ -106,9 +107,54 @@ mod tests {
}
#[test]
fn test_docfreq() {
let mut schema = schema::Schema::new();
let text_field = schema.add_text_field("text", schema::TEXT);
let index = Index::create_in_ram(schema);
{
let mut index_writer = index.writer_with_num_threads(1).unwrap();
let mut doc = Document::new();
doc.add_text(text_field, "a b c");
index_writer.add_document(doc).unwrap();
index_writer.wait().unwrap();
}
{
let mut index_writer = index.writer_with_num_threads(1).unwrap();
{
let mut doc = Document::new();
doc.add_text(text_field, "a");
index_writer.add_document(doc).unwrap();
}
{
let mut doc = Document::new();
doc.add_text(text_field, "a a");
index_writer.add_document(doc).unwrap();
}
index_writer.wait().unwrap();
}
{
let mut index_writer = index.writer_with_num_threads(1).unwrap();
let mut doc = Document::new();
doc.add_text(text_field, "c");
index_writer.add_document(doc).unwrap();
index_writer.wait().unwrap();
}
{
let searcher = index.searcher().unwrap();
let term_a = Term::from_field_text(text_field, "a");
assert_eq!(searcher.doc_freq(&term_a), 3);
let term_b = Term::from_field_text(text_field, "b");
assert_eq!(searcher.doc_freq(&term_b), 1);
let term_c = Term::from_field_text(text_field, "c");
assert_eq!(searcher.doc_freq(&term_c), 2);
let term_d = Term::from_field_text(text_field, "d");
assert_eq!(searcher.doc_freq(&term_d), 0);
}
}
#[test]
fn test_termfreq() {
let mut schema = schema::Schema::new();
let text_field = schema.add_text_field("text", schema::TEXT);
let index = Index::create_in_ram(schema);