C# YaCy P2P 搜索示例
一个使用 C# 查询 YaCy 对等节点的示例。
引言
这是一个使用 C# 查询 YaCy 对等节点以获取搜索结果的快速示例。
背景
YaCy 是一个开源的点对点网络搜索引擎/爬虫。它可以用于为本地内联网和文档存储提供搜索功能,或者它可以为全球 P2P 网络做出贡献,以分散的方式提供网络爬取/索引/搜索。
更多信息请访问 http://yacy.net。
Using the Code
下面的 YacyServer
类是一个简单的类,用于跟踪您希望使用的 YaCy 对等节点的 URI 以及您的 Web 代理的详细信息(如果需要)。
传递给构造函数的 URI 应该是一个活动的 YaCy 对等节点。
主要使用的方法是 Search
,它有一个重载,仅使用默认的最大结果数。如您所见,它只是一个 Web 请求,结果是 RSS。
返回结果是 SearchResult
对象的枚举。
/// <summary>
/// Encapsulates a YaCy web server
/// </summary>
public class YacyServer
{
private Uri uri;
private IWebProxy proxy;
public YacyServer(Uri webServerUri) : this(null, webServerUri) { }
public YacyServer(IWebProxy proxy, Uri webServerUri)
{
uri = webServerUri;
this.proxy = proxy;
}
private int _max = 500;
public int MaxResultDefault
{
get { return _max; }
set { if (value != 0) _max = Math.Abs(value); }
}
public IEnumerable<SearchResult> Search(string search)
{
return Search(0, search);
}
public IEnumerable<SearchResult> Search(int maxResults, string search)
{
List<SearchResult> result = new List<SearchResult>();
string request = uri.Scheme + "://" + uri.Host + ":" + uri.Port +
"/yacysearch.rss?query=" + HttpUtility.UrlEncode(search);
if(maxResults > 0)
request += "&maximumRecords=" + maxResults.ToString();
else
request += "&maximumRecords=" + _max.ToString();
request += "&resource=global";
// important, don't just search the local index
WebRequest wr = (WebRequest)HttpWebRequest.Create(request);
if (proxy != null)
wr.Proxy = proxy;
WebResponse resp = wr.GetResponse();
XmlDocument doc = new XmlDocument();
doc.Load(resp.GetResponseStream());
XmlNodeList results = doc.SelectNodes("/rss/channel/item");
foreach (XmlNode node in results)
result.Add(new SearchResult(node));
return (IEnumerable<SearchResult>)result;
}
}
显然,还有很多东西没有显示:错误处理,或者使 Web 请求异步,例如。
SearchResult
类只是一个包装器
/// <summary>
/// Encapsulates a YaCy search result
/// </summary>
public class SearchResult
{
private XmlNode data;
protected internal SearchResult(XmlNode data)
{
this.data = data;
}
public string Title
{
get { return data["title"].InnerText; }
}
public string Link
{
get { return data["link"].InnerText; }
}
public string Description
{
get { return data["description"].InnerText; }
}
}
在 Windows 窗体中使用这些类就像这样
private void Form1_Load(object sender, EventArgs e)
{
// this is my yacy peer address,
// read how to set up your own yacy peer at http://yacy.net
server = new YacyServer(new Uri("http://abbot.is-a-geek.net:8080"));
}
private YacyServer server;
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
IEnumerable<SearchResult> result = server.Search(textBox1.Text);
// The search result uses this interface
// so it can be further filtered using Linq
// eg:
// var x = from p in result where p.Title.Contains("Blog") select p;
dataGridView1.DataSource = result;
button1.Enabled = true;
}
关注点
Search
函数返回 IEnumerable<T>
,因此可以使用 LINQ 在客户端进一步过滤搜索结果。
有关更多 API 文档,请点击 此处。
摘要
YaCy 拥有庞大的 API 并且可以搜索许多类型的内容;如果有人希望请求更多 YaCy 文章示例,我将尽力满足。
YaCy 提供了一个开源的点对点搜索解决方案,可以以多种方式改善您自己的网站以及互联网的自由(YaCy 不能被审查,因为它没有中央控制点)。
公共对等网络(“自由世界”)仍在不断发展,请 参与其中。