65.9K
CodeProject 正在变化。 阅读更多。
Home

C# YaCy P2P 搜索示例

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (8投票s)

2010年8月16日

CPOL

2分钟阅读

viewsIcon

30777

downloadIcon

1918

一个使用 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 不能被审查,因为它没有中央控制点)。

公共对等网络(“自由世界”)仍在不断发展,请 参与其中

© . All rights reserved.