mirror of
https://github.com/quickwit-oss/tantivy.git
synced 2025-12-23 02:29:57 +00:00
Applied this command to the code, making it a bit shorter and slightly more readable. ``` cargo +nightly clippy --all-features --benches --tests --workspace --fix -- -A clippy::all -W clippy::uninlined_format_args cargo +nightly fmt --all ```
86 lines
3.1 KiB
Rust
86 lines
3.1 KiB
Rust
// # Snippet example
|
||
//
|
||
// This example shows how to return a representative snippet of
|
||
// your hit result.
|
||
// Snippet are an extracted of a target document, and returned in HTML format.
|
||
// The keyword searched by the user are highlighted with a `<b>` tag.
|
||
|
||
// ---
|
||
// Importing tantivy...
|
||
use tantivy::collector::TopDocs;
|
||
use tantivy::query::QueryParser;
|
||
use tantivy::schema::*;
|
||
use tantivy::{doc, Index, Snippet, SnippetGenerator};
|
||
use tempfile::TempDir;
|
||
|
||
fn main() -> tantivy::Result<()> {
|
||
// Let's create a temporary directory for the
|
||
// sake of this example
|
||
let index_path = TempDir::new()?;
|
||
|
||
// # Defining the schema
|
||
let mut schema_builder = Schema::builder();
|
||
let title = schema_builder.add_text_field("title", TEXT | STORED);
|
||
let body = schema_builder.add_text_field("body", TEXT | STORED);
|
||
let schema = schema_builder.build();
|
||
|
||
// # Indexing documents
|
||
let index = Index::create_in_dir(&index_path, schema)?;
|
||
|
||
let mut index_writer = index.writer(50_000_000)?;
|
||
|
||
// we'll only need one doc for this example.
|
||
index_writer.add_document(doc!(
|
||
title => "Of Mice and Men",
|
||
body => "A few miles south of Soledad, the Salinas River drops in close to the hillside \
|
||
bank and runs deep and green. The water is warm too, for it has slipped twinkling \
|
||
over the yellow sands in the sunlight before reaching the narrow pool. On one \
|
||
side of the river the golden foothill slopes curve up to the strong and rocky \
|
||
Gabilan Mountains, but on the valley side the water is lined with trees—willows \
|
||
fresh and green with every spring, carrying in their lower leaf junctures the \
|
||
debris of the winter’s flooding; and sycamores with mottled, white, recumbent \
|
||
limbs and branches that arch over the pool"
|
||
))?;
|
||
// ...
|
||
index_writer.commit()?;
|
||
|
||
let reader = index.reader()?;
|
||
let searcher = reader.searcher();
|
||
let query_parser = QueryParser::for_index(&index, vec![title, body]);
|
||
let query = query_parser.parse_query("sycamore spring")?;
|
||
|
||
let top_docs = searcher.search(&query, &TopDocs::with_limit(10))?;
|
||
|
||
let snippet_generator = SnippetGenerator::create(&searcher, &*query, body)?;
|
||
|
||
for (score, doc_address) in top_docs {
|
||
let doc = searcher.doc(doc_address)?;
|
||
let snippet = snippet_generator.snippet_from_doc(&doc);
|
||
println!("Document score {score}:");
|
||
println!(
|
||
"title: {}",
|
||
doc.get_first(title).unwrap().as_text().unwrap()
|
||
);
|
||
println!("snippet: {}", snippet.to_html());
|
||
println!("custom highlighting: {}", highlight(snippet));
|
||
}
|
||
|
||
Ok(())
|
||
}
|
||
|
||
fn highlight(snippet: Snippet) -> String {
|
||
let mut result = String::new();
|
||
let mut start_from = 0;
|
||
|
||
for fragment_range in snippet.highlighted() {
|
||
result.push_str(&snippet.fragment()[start_from..fragment_range.start]);
|
||
result.push_str(" --> ");
|
||
result.push_str(&snippet.fragment()[fragment_range.clone()]);
|
||
result.push_str(" <-- ");
|
||
start_from = fragment_range.end;
|
||
}
|
||
|
||
result.push_str(&snippet.fragment()[start_from..]);
|
||
result
|
||
}
|