summaryrefslogtreecommitdiffstats
path: root/examples/faceted_search.rs
blob: 7ac67c31564314cbefd6ff33976cd1f75c0b63bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// # Basic Example
//
// This example covers the basic functionalities of
// tantivy.
//
// We will :
// - define our schema
// = create an index in a directory
// - index few documents in our index
// - search for the best document matchings "sea whale"
// - retrieve the best document original content.

// ---
// Importing tantivy...
use tantivy::collector::FacetCollector;
use tantivy::query::AllQuery;
use tantivy::schema::*;
use tantivy::{doc, Index};
use tempfile::TempDir;

fn main() -> tantivy::Result<()> {
    // Let's create a temporary directory for the
    // sake of this example
    let index_path = TempDir::new()?;
    let mut schema_builder = Schema::builder();

    schema_builder.add_text_field("name", TEXT | STORED);

    // this is our faceted field
    schema_builder.add_facet_field("tags");

    let schema = schema_builder.build();

    let index = Index::create_in_dir(&index_path, schema.clone())?;

    let mut index_writer = index.writer(50_000_000)?;

    let name = schema.get_field("name").unwrap();
    let tags = schema.get_field("tags").unwrap();

    // For convenience, tantivy also comes with a macro to
    // reduce the boilerplate above.
    index_writer.add_document(doc!(
        name => "the ditch",
        tags => Facet::from("/pools/north")
    ));

    index_writer.add_document(doc!(
        name => "little stacey",
        tags => Facet::from("/pools/south")
    ));

    index_writer.commit()?;

    let reader = index.reader()?;

    let searcher = reader.searcher();

    let mut facet_collector = FacetCollector::for_field(tags);
    facet_collector.add_facet("/pools");

    let facet_counts = searcher.search(&AllQuery, &facet_collector).unwrap();

    // This lists all of the facet counts
    let facets: Vec<(&Facet, u64)> = facet_counts.get("/pools").collect();
    assert_eq!(
        facets,
        vec![
            (&Facet::from("/pools/north"), 1),
            (&Facet::from("/pools/south"), 1),
        ]
    );

    Ok(())
}