A3S Search
Results
Search results, scoring, deduplication, and result types
Results
A search returns a SearchResults (Rust) / SearchResponse (SDK) containing ranked, deduplicated results and per-engine metadata.
Iterating Results
let results = search.search(query).await?;
println!("{} results in {}ms", results.count, results.duration_ms);
for result in results.items().iter().take(10) {
println!("{}: {}", result.title, result.url);
println!(" Score: {:.2}", result.score);
println!(" Engines: {:?}", result.engines);
if let Some(date) = &result.published_date {
println!(" Published: {}", date);
}
}response = await search.search("rust programming")
print(f"{response.count} results in {response.duration_ms}ms")
for r in response.results:
print(f"{r.title}: {r.url}")
print(f" Score: {r.score:.2f}")
print(f" Engines: {r.engines}")
if r.published_date:
print(f" Published: {r.published_date}")const response = await search.search('rust programming');
console.log(`${response.count} results in ${response.durationMs}ms`);
for (const r of response.results) {
console.log(`${r.title}: ${r.url}`);
console.log(` Score: ${r.score.toFixed(2)}`);
console.log(` Engines: ${r.engines.join(', ')}`);
if (r.publishedDate) {
console.log(` Published: ${r.publishedDate}`);
}
}SearchResult Fields
Prop
Type
Python uses snake_case (result_type, published_date). Node.js uses camelCase (resultType, publishedDate).
Result Types
pub enum ResultType {
Default, // Standard web result
Answer, // Direct answer (e.g., Wikipedia infobox)
News, // News article
Image, // Image result
Video, // Video result
}Deduplication
Results from multiple engines are merged by normalized URL. When two engines return the same page:
- The best title and snippet are kept
- Both engine names are added to
engines - Positions from both engines are recorded
- Score is calculated from all contributing engines
// Result found by 3 engines ranks significantly higher than one found by 1
for result in results.items().iter().take(5) {
let coverage = result.engines.len();
println!("[{coverage} engines] {:.2} — {}", result.score, result.title);
}Engine Errors
Each engine runs independently — failures don't block other engines:
for (engine, error) in results.errors() {
eprintln!("Engine '{}' failed: {}", engine, error);
}for err in response.errors:
print(f"Engine '{err.engine}' failed: {err.message}")for (const err of response.errors) {
console.error(`Engine '${err.engine}' failed: ${err.message}`);
}Suggestions and Answers (Rust)
for suggestion in results.suggestions() {
println!("Did you mean: {}", suggestion);
}
for answer in results.answers() {
println!("Answer: {}", answer);
}SearchResults / SearchResponse API
Rust (SearchResults)
Prop
Type
Python (SearchResponse)
Prop
Type
Node.js (SearchResponse)
Prop
Type
Error Handling
match search.search(query).await {
Ok(results) => {
// Per-engine failures don't block — check errors()
for (engine, error) in results.errors() {
eprintln!("Engine '{}' failed: {}", engine, error);
}
}
Err(e) => eprintln!("Search failed: {}", e),
}try:
response = await search.search('query')
except SearchError as e:
print(f'Search failed: {e}')
# Per-engine failures don't raise — check response.errors
for err in response.errors:
print(f"Engine '{err.engine}' failed: {err.message}")Prop
Type
try {
const response = await search.search('query');
} catch (err) {
if (err instanceof SearchError) {
console.error(`Search failed: ${err.message}`);
}
}
// Per-engine failures don't throw — check response.errors
for (const err of response.errors) {
console.warn(`Engine '${err.engine}' failed: ${err.message}`);
}Prop
Type