second_indexr

Xapian搜索引擎示例
本文介绍了一个使用Xapian库实现的简单全文搜索引擎示例。该示例演示了如何从多个文本文件中读取数据,并将其索引到Xapian数据库中。通过Xapian的TermGenerator和Stem组件,实现了英文文本的分词和词干提取,从而为后续的搜索查询提供了高效的基础。


#include<iostream>

#include<xapian.h>

#include<vector>

#include<string>

#include<fstream>

using namespace std;

 

int main(int argc , char **argv){

 

 try{

   Xapian::WritableDatabase  database(argv[1],Xapian::DB_CREATE_OR_OPEN);

   //分词器

   Xapian::TermGenerator  indexer;

   Xapian::Stem  stemmer("english");

   indexer.set_stemmer(stemmer);

   

   Xapian::Document doc1,doc2,doc3,doc4,doc5;

 

   vector<Xapian::Document>doc = {doc1,doc2,doc3,doc4,doc5};

 

 

   vector<string>path1 ={"/usr/local/txtdata/txt1","/usr/local/txtdata/txt2","/usr/local/txtdata/txt3","/usr/local/txtdata/txt4","/usr/local/txtdata/txt5"};

   string s;

   string data;

   int i = 0;

   for(auto&p : path1){

      ifstream  ifile(p);

      while(getline(ifile,s))

          data =data + s;

      cout<<"dayingdata: "<<data<<endl;

      doc[i].set_data(data);

      indexer.set_document(doc[i]);

      indexer.index_text(data);

      database.add_document(doc[i++]);

      s.resize(0);

      

      }

   database.commit();

 

 

   for(auto i=0; i!= 5 ; ++i){

      cout<<"["<<doc[i].get_data()<<"]"<<"\n"<<endl;}

      }catch(const Xapian::Error &error){

      cout<<"exception:"<<error.get_msg()<<endl;}

   }  

 

 

 

void SdNavigationHighway::SelectGuideLanesWithLd( const std::vector<uint64_t> &bev_ego_root_section_x0, const std::map<double, RecommendLane> &ld_recommend_lane, BevMapInfoPtr &GlobalBevMapOutPut, std::vector<std::pair<uint64_t, std::pair<int, int>>> &guide_lane_result, std::vector<uint64_t> &sd_guide_lane_ids) { std::set<uint64_t> bev_guide_lanes_with_ld; guide_lane_result.clear(); sd_guide_lane_ids.clear(); if (bev_ego_root_section_x0.empty() || ld_recommend_lane.empty()) { SD_FINE_MATCH_LOG << "bev or ld is empty, return: " << bev_ego_root_section_x0.empty() << ", " << ld_recommend_lane.empty(); return; } for (auto &bev_ego_id : bev_ego_root_section_x0) { SD_FINE_MATCH_LOG << "bev_ego_id: " << bev_ego_id; } RecommendLane ld_target_lane; bool is_found = false; for (auto it = ld_recommend_lane.begin(); it != ld_recommend_lane.end(); ++it) { if (it->first < 0.0) { auto next_it = std::next(it); if (next_it != ld_recommend_lane.end() && next_it->first > 0.0) { ld_target_lane = it->second; is_found = true; break; } if (next_it == ld_recommend_lane.end()) { ld_target_lane = it->second; is_found = true; break; } } } if (!is_found) { return; } constexpr double kLdGuideRemmRange = 200.0; int ld_ego_lane_num = ld_target_lane.lane_num; int bev_ego_lane_num = bev_ego_root_section_x0.size(); int lane_num_diff = std::abs(ld_ego_lane_num - bev_ego_lane_num); bool ld_match_from_left = true; // 1 left, 0 right double nearest_distance = std::numeric_limits<double>::max(); // 自车脚下bev车道和地图车道数对不上 if (bev_ego_lane_num != ld_ego_lane_num) { auto it_target_lane = std::find_if( ld_recommend_lane.begin(), ld_recommend_lane.end(), [&](const auto &pair) { return pair.second == ld_target_lane; }); if (it_target_lane != ld_recommend_lane.end()) { for (auto it = it_target_lane; it != ld_recommend_lane.end(); ++it) { if ((it->second.lane_num == bev_ego_lane_num) && (it->first < kLdGuideRemmRange)) { // case1:自车脚下未匹配,合理范围内匹配上 SD_FINE_MATCH_LOG << "Case1: bev and ld lane num match at a distance"; ld_target_lane = it->second; ld_match_from_left = true; break; } // case2:合理范围未匹配上,且地图和感知车道数相差较大 if ((std::next(it) == ld_recommend_lane.end()) && (lane_num_diff > 1)) { int ego_bev_id, ego_bev_index = -1; for (auto &bev_root_id : bev_ego_root_section_x0) { auto lane_r = INTERNAL_PARAMS.raw_bev_data.GetLaneInfoById(bev_root_id); if (!lane_r) { continue; } if (lane_r->position == (int)BevLanePosition::LANE_LOC_EGO) { ego_bev_id = bev_root_id; break; } else { int nearest_index = lane_r->indexed_geos.FindNearestPoint(0.0, 0.0); if (nearest_index >= 0 && nearest_index < static_cast<int>(lane_r->geos->size())) { double lane_distance = fabs(0.0 - lane_r->geos->at(nearest_index).y()); SD_FINE_MATCH_LOG << "lane_distance: " << lane_distance; if (lane_distance < nearest_distance) { nearest_distance = lane_distance; ego_bev_id = bev_root_id; } } } } SD_FINE_MATCH_LOG << "ego_bev_id: " << ego_bev_id; auto it = std::find(bev_ego_root_section_x0.begin(), bev_ego_root_section_x0.end(), ego_bev_id); if (it != bev_ego_root_section_x0.end()) { ego_bev_index = std::distance(bev_ego_root_section_x0.begin(), it); if (ego_bev_index < static_cast<double>(bev_ego_lane_num) / 2.0f) { ld_match_from_left = true; } else { ld_match_from_left = false; } } else { ld_match_from_left = true; } SD_FINE_MATCH_LOG << "Case2: bev and ld lane num not match"; } } } } SD_FINE_MATCH_LOG << "section_id: " << ld_target_lane.section_id; std::vector<int> ego_lane_index_left, ego_lane_index_right; ego_lane_index_left.reserve(bev_ego_root_section_x0.size()); // ego_lane_index_right.reserve(bev_ego_root_section_x0.size()); for (int i = 1; i <= bev_ego_root_section_x0.size(); ++i) { ego_lane_index_left.emplace_back(i); // ego_lane_index_right.emplace_back(bev_ego_root_section_x0.size() - i + // 1); } // for (auto &lane_left : ego_lane_index_left) { // SD_FINE_MATCH_LOG << "lane_left: " << int(lane_left); // } // for (auto &lane_right : ego_lane_index_right) { // SD_FINE_MATCH_LOG << "lane_right: " << int(lane_right); // } for (auto &ld_target_index : ld_target_lane.lane_seqs) { SD_FINE_MATCH_LOG << "ld_target_index: " << ld_target_index; if (ld_match_from_left) { auto find_bev = std::find(ego_lane_index_left.begin(), ego_lane_index_left.end(), ld_target_index); if (find_bev != ego_lane_index_left.end()) { auto &bev_road_id = bev_ego_root_section_x0.at( std::distance(ego_lane_index_left.begin(), find_bev)); SD_FINE_MATCH_LOG << "from left bev_road_id: " << bev_road_id; bev_guide_lanes_with_ld.insert(bev_road_id); } else { auto find_closest = std::min_element( ego_lane_index_left.begin(), ego_lane_index_left.end(), [&ld_target_index](const int &a, const int &b) { return std::abs(a - static_cast<int>(ld_target_index)) < std::abs(b - static_cast<int>(ld_target_index)); }); if (find_closest != ego_lane_index_left.end()) { auto &bev_road_id = bev_ego_root_section_x0.at( std::distance(ego_lane_index_left.begin(), find_closest)); SD_FINE_MATCH_LOG << "from left closest bev_road_id: " << bev_road_id; bev_guide_lanes_with_ld.insert(bev_road_id); } } } else { auto bev_ego_root_section_x0_right = std::vector<uint64_t>( bev_ego_root_section_x0.end() - std::min(ld_target_lane.lane_num, bev_ego_root_section_x0.size()), bev_ego_root_section_x0.end()); for (int i = 1; i <= bev_ego_root_section_x0_right.size(); ++i) { ego_lane_index_right.emplace_back(i); SD_FINE_MATCH_LOG << "bev_ego_id_right: " << bev_ego_root_section_x0_right.at(i - 1); } auto find_bev = std::find(ego_lane_index_right.begin(), ego_lane_index_right.end(), ld_target_index); if (find_bev != ego_lane_index_right.end()) { auto &bev_road_id = bev_ego_root_section_x0_right.at( std::distance(ego_lane_index_right.begin(), find_bev)); SD_FINE_MATCH_LOG << "from right bev_road_id: " << bev_road_id; bev_guide_lanes_with_ld.insert(bev_road_id); } else { auto find_closest = std::min_element( ego_lane_index_right.begin(), ego_lane_index_right.end(), [&ld_target_index](const int &a, const int &b) { return std::abs(a - static_cast<int>(ld_target_index)) < std::abs(b - static_cast<int>(ld_target_index)); }); if (find_closest != ego_lane_index_right.end()) { auto &bev_road_id = bev_ego_root_section_x0_right.at( std::distance(ego_lane_index_right.begin(), find_closest)); SD_FINE_MATCH_LOG << "from right closest bev_road_id: " << bev_road_id; bev_guide_lanes_with_ld.insert(bev_road_id); } } } } std::unordered_map<uint64_t, BevLaneInfo *> lane_map; lane_map.clear(); for (auto &lane : GlobalBevMapOutPut->lane_infos) { lane_map[lane.id] = &lane; } std::vector<uint64_t> match_guide_lanes; for (auto &ego_start_id : bev_guide_lanes_with_ld) { match_guide_lanes.clear(); if (lane_map.find(ego_start_id) == lane_map.end()) { return; } std::queue<uint64_t> q; std::unordered_set<uint64_t> visited; q.push(ego_start_id); visited.insert(ego_start_id); while (!q.empty()) { uint64_t cur = q.front(); q.pop(); const BevLaneInfo *info = lane_map.at(cur); if (info->next_lane_ids.empty()) { match_guide_lanes.push_back(cur); } else { for (uint64_t nxt : info->next_lane_ids) { if (lane_map.find(nxt) == lane_map.end()) continue; if (visited.insert(nxt).second) { q.push(nxt); } } } } } auto &navi_debug_infos = INTERNAL_PARAMS.navigation_info_data.navi_debug_infos(); sd_guide_lane_ids = match_guide_lanes; for (auto &laneid_tmp : sd_guide_lane_ids) { guide_lane_result.push_back({laneid_tmp, {-1, 0}}); } std::ostringstream os1; for (auto guide_laneid_tmp : sd_guide_lane_ids) { os1 << guide_laneid_tmp << ","; } SD_FINE_MATCH_LOG << "[SelectGuideLanesWithLd] : " << os1.str(); navi_debug_infos.guide_laneids_refer = sd_guide_lane_ids; } 详细解释下代码,加上注释
最新发布
10-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值