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
76
77
78
79
80
81
82
83
84
//! # a3s-search
//!
//! An embeddable meta search engine library inspired by SearXNG.
//!
//! This library provides a framework for aggregating search results from multiple
//! search engines, with support for:
//!
//! - Async parallel search execution
//! - Result deduplication and merging
//! - Configurable ranking algorithms
//! - Extensible engine interface
//! - Dynamic proxy IP pool for anti-crawler protection
//!
//! ## Example
//!
//! ```rust,no_run
//! use a3s_search::{Search, SearchQuery, engines::DuckDuckGo};
//!
//! #[tokio::main]
//! async fn main() -> anyhow::Result<()> {
//! let mut search = Search::new();
//! search.add_engine(DuckDuckGo::new());
//!
//! let query = SearchQuery::new("rust programming");
//! let results = search.search(query).await?;
//!
//! for result in results.items() {
//! println!("{}: {}", result.title, result.url);
//! }
//! Ok(())
//! }
//! ```
//!
//! ## Using Proxy Pool
//!
//! ```rust,no_run
//! use a3s_search::{Search, SearchQuery, engines::DuckDuckGo};
//! use a3s_search::proxy::{ProxyPool, ProxyConfig};
//!
//! #[tokio::main]
//! async fn main() -> anyhow::Result<()> {
//! // Create a proxy pool with multiple proxies
//! let proxy_pool = ProxyPool::with_proxies(vec![
//! ProxyConfig::new("proxy1.example.com", 8080),
//! ProxyConfig::new("proxy2.example.com", 8080),
//! ]);
//!
//! let mut search = Search::new();
//! search.set_proxy_pool(proxy_pool);
//! search.add_engine(DuckDuckGo::new());
//!
//! let query = SearchQuery::new("rust programming");
//! let results = search.search(query).await?;
//!
//! Ok(())
//! }
//! ```
pub use Aggregator;
pub use ;
pub use ;
pub use ;
pub use HttpFetcher;
pub use SearchQuery;
pub use ;
pub use Search;
pub use ;