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

来源:互联网 发布:北大方正软件技术学院 编辑:程序博客网 时间:2024/06/06 20:04

 数据写入

//首先建立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.htmlqp.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++;}


 

原创粉丝点击