如何使用Xapian进行数据写入和查找

 数据写入

//首先建立db对象
Xapian::WritableDatabase* db; 首先建立可写入的xapian格式的数据库
//建立一个string类型的字符串
string para;

//在运用时首先在构造函数中创建对象
db = new Xapian::WritableDatabase(Index_dir, Xapian::DB_CREATE_OR_OPEN);
//其中index_dir是存储目录,xapian存储的地方是一个文件夹,后面的参数为xapian自带参数

//进行数据写入 
Xapian::Document doc;
Xapian::TermGenerator indexer;
//把一个含有多个字段的结构数值进行拼装,用到最初的para字符串,log是一个结构
para = log.cmd + " " + log.cmd_string + " " + log.conn_time + " "+ log.post_param + " " + log.probe_id + " " + log.cookie + " "+ log.sip + " " + log.sport;
//设定主数据,该数据可以被多个关键字进行标识
doc.set_data(para);
//构建关键字,属于精确匹配的范围,add_term用于建立模糊查询的关键字
doc.add_value(1, log.cmd);
doc.add_value(2, log.conn_time);
doc.add_value(3, log.post_param);
doc.add_value(4, log.probe_id);
doc.add_value(5, log.sip);
doc.add_value(6, log.sport);
doc.add_value(7, log.cookie);
doc.add_value(8, log.cmd_string);
//建立索引信息
indexer.set_document(doc);
indexer.index_text(para);
//把文件添加到数据库中
db->add_document(doc);


 

数据查找

//首先要设置过滤条件,这里设定一个结构类型的过滤器
filter f;//filter是一个结构类型
f.cmd = temp[0];
f.probeid = temp[1];
f.post_parm = temp[2];
f.starttime = temp[3];
f.endtime = temp[4];
f.ip = temp[5];
f.port = temp[6];
f.perpage = atoi(temp[7].c_str());
f.page = atoi(temp[8].c_str());
f.word = temp[9];
//建立一个容器,用来存放查询得到的数据
std::vector<sqllog> list; //sqllog也是一个结构类型,显示查询的信息

//下面是使用xapian进行查询
Xapian::Database outDB(Index_dir);//文件所在路径的数据库
Xapian::Enquire enquire(outDB);//建立查询位置
string query_string;//查询字符串

query_string = f.word;//设定查询字符串
//建立查询分析
Xapian::QueryParser qp;
//设定查询数据库
qp.set_database(outDB);
//设置查询策略 有NONE,SOME,ALL三种,具体看参考文档docs/apidoc/html/classXapian_1_1QueryParser.html
qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
//生成查询条件
Xapian::Query query;
//提交查询关键字
query = qp.parse_query(query_string);
//以下进行查询
Xapian::Query queryCmd = Xapian::Query(Xapian::Query::OP_VALUE_RANGE, 1, f.cmd, f.cmd);
Xapian::Query queryProbeid = Xapian::Query(Xapian::Query::OP_VALUE_RANGE, 4, f.probeid, f.probeid);
Xapian::Query queryPostparam = Xapian::Query(Xapian::Query::OP_VALUE_RANGE, 3, f.post_parm, f.post_parm);
Xapian::Query queryLogtime = Xapian::Query(Xapian::Query::OP_VALUE_RANGE, 2, f.starttime, f.endtime);
Xapian::Query queryIp = Xapian::Query(Xapian::Query::OP_VALUE_RANGE, 5,f.ip, f.ip);
Xapian::Query queryPort = Xapian::Query(Xapian::Query::OP_VALUE_RANGE,6, f.port, f.port);
//产生组合查询条件
Xapian::Query lastQuery;
lastQuery = query;//关键字
//设置组合条件
lastQuery = Xapian::Query(Xapian::Query::OP_AND, lastQuery,queryLogtime);
lastQuery= Xapian::Query(Xapian::Query::OP_AND, lastQuery, queryIp);
lastQuery = Xapian::Query(Xapian::Query::OP_AND, lastQuery,queryPostparam);
lastQuery = Xapian::Query(Xapian::Query::OP_AND, lastQuery,queryCmd);

enquire.set_query(lastQuery);
//返回查找到得集合
Xapian::MSet matchesAll = enquire.get_mset(0, outDB.get_doccount());
//循环进行值查找,slrank是一个结构数组
for (Xapian::MSetIterator i = matchesAll.begin(); i != matchesAll.end(); ++i)
{
	slrank[k].cmd = i.get_document().get_value(1);
	slrank[k].conn_time = i.get_document().get_value(2);
	slrank[k].post_param = i.get_document().get_value(3);
	slrank[k].probe_id = i.get_document().get_value(4);
	slrank[k].sip = i.get_document().get_value(5);
	slrank[k].sport = i.get_document().get_value(6);
	slrank[k].cookie = i.get_document().get_value(7);
	slrank[k].cmd_string = i.get_document().get_value(8);
	//把值返回到list中,以后值需要调用list容器即可
	list.push_back(slrank[k]);
	k++;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值