Posts Tagged ‘’

搜索namipan的资源请到 — namipan.info

Sunday, May 11th, 2008

http://namipan.info 提供namipan的资源的customer search engine. 针对namipan.com的资源提供搜索功能.



每天都有惊喜 — 不劳动也有收获

Friday, May 9th, 2008

原本无心插柳, 却有了意外收获, 我的一个只有一个页面的网站, 这一个星期突然访问量增加的很快, 今天pv已经到了900+, 呵呵, 居然今天ad的收入到 $1.00, 真是异想不到啊. 对于这种天上掉的馅饼, 我仔细研究了一下, 由于有google-analysis, 一看访问量来源, 大部分来自baidu. 到baidu搜索一下, 结果发现, 这个page已经到了baidu收缩的首页, 呵呵, 看来如果能SEO到各大搜索引擎的的第一页, 带来的访问量将是巨大的. 这样充分说明了, 一些做SEO的必要性, 但是, anyway, 你的内容是大家需要, 你提供优质的服务, 那么, 你才会积累跟多的用户, I still believe “酒香不怕巷子深”~~!!

Search Engine 学习笔记 —— Store Server

Tuesday, January 29th, 2008

最近读了介绍google架构的paper : The Anatomy of a Large-Scale Hypertextual Web Search Engine. 还是学习到了很多东西, 尤其对我这个刚刚入门搜索引擎的人.:). 其中架构中, 有这样一个角色就是 Store Server 和 Repository Database. 他们是全部抓取的page的保存, 而架构中的其他角色都是围绕这个page来进行, 而且通过Repository可以将其他所有数据恢复. 因此, 这个部分应该整个search engine的基础.所以.今天我们来设计并完成一个Simple Store Server. 这里只是一个simple,具体完善的实现, 等我测试稳定, 会放到开源目录里.:)

在开始之前需要一些热身准备活动. :). 如果你有一下知识,可以更好的理解架构,以及代码部分的实现和编译.

  • 需要了解ACE架构, ACE Reactor, ACE Task等.
  • 需要了解mysql++.
  • 需要了解zipstream.
  • 需要知道多线程的基础知识.
  • 需要一些基本的web知识.

OK.有了一些基础知识, 我开始第一步, 架构的设计.由于之前的一些测试表明 Dreamhost无法接受较大的HTTP RAW DATA, 因此需要自己实现一个简单的web功能,并将crawler收集的数据通过mysql++发送给已经在Dreamhost建立好的数据库存储. 以后indexer可以通过Repository来获取page去建立index, links, barrels等. 这些都是以后会逐步设计实现的.

之所以使用WEB是希望这个Store server以后可以方便的移植到fcgi,或者在linux起独立的进程,更重要的是http协议是相对来说在internet上限制小的协议, 有些公司只允许http访问, 而TCP/UDP的协议是不允许的. 考虑到crawler是分布式在不同的peer上,因此使用http post的方法上传数据, 还是更加容易满足大多数peer的情况. :). 对于store server也可以作为public peer的一种职能. 而Repository也将是分布式的存储.

由于我们是设计simple的server,所以太多feature不能一一实现, 只要在架构允许, 那么使用者以后可以自己扩展并且实现自己想要的功能.

这里还要说明一点,为什么模型设计成多线程, 主要由于mysql++实现是使用阻塞的socket. 这样没有办法和非阻塞的reactore模型一起使用. 因为server得设计应该是高效的, 自然就想到的线程模型. web thread负责接受http post过来的数据, 然后扔到一个队列中, 而负责database操作的thread从queue中那种数据, 并insert到数据库里. 这个想法很自然. 多个线程共享的资源只有一个queue, 因此对queue的操作需要保护.

store server

几点说明,

  1. 从上面的架构来看不难发现, 主要效率问题会体现在Queue的读写操作. 尤其Store Server面对大量crawler返回的数据来说, 不过如果store server集成在peer的功能中,那么peer即使crawler也是storer.这样压力主要体现在分布式数据上.至于这里, 我还没有收集跟多的资料.
  2. 在Web Thread目前使用reactor模型, 这里是为了使用以往已经实现的稳定代码, 实际上, 这个simple的设计完全可以使用proactor模型,和ACE中Message Queue来实现, 不过 首先你要熟悉proactor的架构.:)
  3. 我的实现为了简便,并且作为轻量级的simple server,在实现中, 有错误或者不好的地方,请见谅. :)
以下是部分.h文件,

#ifndef WEB_HANDLER_H
#define WEB_HANDLER_H

#include <ace/Thread_Mutex.h>
#include <ace/Task.h>
#include <ace/OS.h>
#include <ace/Log_Msg.h>
#include <ace/Message_Block.h>

#include "../../common/HTTP_Handler/HTTP_Server.h"

#include <map>

class Queue_Handler;

class Web_Handler :
public ACE_Task_Base,
public HTTP_Server_Callback
{
public:
Web_Handler();
~Web_Handler();

public:
bool open(
Queue_Handler *queue_handler,
const std::vector<ACE_INET_Addr> &addrs
);

bool close();

public:
virtual bool on_http_request(
const HTTP_HANDLER handler,
const char *uri,
const size_t content_length,
const std::map<std::string, std::string> &params
);

virtual bool on_http_content(
const HTTP_HANDLER handler,
const char *content_recv,
const size_t content_recv_length
);

virtual bool on_http_hunger(const HTTP_HANDLER handler);

virtual void on_http_close(const HTTP_HANDLER handler);

public:
virtual int svc (void);

private:
struct HANDLER_INFO
{
size_t content_size;
size_t recved_size;
std::string page_url;
ACE_Message_Block *page_content;
};

bool find_http_handler(const HTTP_HANDLER http_handler);
bool delete_http_handler(const HTTP_HANDLER http_handler);

bool send_response(const HTTP_HANDLER handler, std::string err_code);

private:
ACE_Reactor *reactor_;

Queue_Handler *queue_handler_;

HTTP_Server *http_server_;

std::map<HTTP_HANDLER, HANDLER_INFO> sessions_;

};

#endif // WEB_HANDLER_H
#ifndef QUEUE_HANDLER_H
#define QUEUE_HANDLER_H

#include <ace/Thread_Mutex.h>
#include <ace/Task.h>
#include <ace/OS.h>
#include <ace/Log_Msg.h>
#include <ace/Message_Block.h>

#include <deque>
#include <string>
#include <utility>

typedef ACE_Thread_Mutex MUTEX;

typedef std::pair<std::string, ACE_Message_Block*> PAGE_PAIR;

class Queue_Handler : public ACE_Task_Base
{
public:
Queue_Handler();
~Queue_Handler();

public:
bool open();
bool close();

public:
void push(std::string link, const ACE_Message_Block *page);
void pop(PAGE_PAIR &page);

public:
virtual int svc(void);

private:
MUTEX mutex_;

std::deque< PAGE_PAIR > queued_pages_;

};

#endif // QUEUE_HANDLER_H

#ifndef DB_HANDLER_H
#define DB_HANDLER_H

#include <ace/Thread_Mutex.h>
#include <ace/Task.h>
#include <ace/OS.h>
#include <ace/Log_Msg.h>
#include <ace/Message_Block.h>

#include "mysql++.h"

#include <string>

#include "Queue_Handler.h"

class DB_Handler : public ACE_Task_Base
{
public:
DB_Handler();
~DB_Handler();

public:
bool open(
std::string db_name,
std::string db_host,
std::string db_user,
std::string db_pass,
Queue_Handler *queue_handler
);
bool close();

public:
virtual int svc (void);

private:
bool update(const PAGE_PAIR &page);
bool query(const PAGE_PAIR &page);

private:
mysqlpp::Connection *con_;

std::string db_name_;
std::string db_host_;
std::string db_user_;
std::string db_pass_;

Queue_Handler *queue_handler_;
};

#endif // DB_HANDLER_H

从一篇论文开始我的搜索引擎学习之路

Thursday, January 17th, 2008



今天开始学习搜索引擎, 大概在google搜了一下, 很多(绝大多数)都是做SEO的, 目的是为了提高自己的网站的排名或页面的pagerank做优化的研究, 其实是利用一切其游戏允许的规则来赢得如google, 百度等的搜索引擎的”青睐”. 真的和搜索技术细节相关的资料,真的太少了.当然, 也许是我还没有查更多的网页, 也许是现在所谓的SEO优化过的网站都排到靠前了吧. 或许该用google的 Scholar来试试了.:)不过还好发现这篇具有讲述google架构的论文

<< The Anatomy of a Large-Scale Hypertextual Web Search Engine>>

的原文. 我的学习之路也由此开始了…..