首页 > 数据库 > > Xapian索引-文档检索过程分析之匹配百分比
Xapian::Query term_one = Xapian::Query("T世界"); Xapian::Query term_two = Xapian::Query("T比赛"); Xapian::Query query = Xapian::Query(Xapian::Query::OP_OR, term_one, term_two); // query组装 std::cout << "query=" << query.get_description() << std::endl; Xapian::Enquire enquire(db); enquire.set_query(query); Xapian::MSet result = enquire.get_mset(, 10); // 执行检索,获取结果 std::cout << "find results count=" << result.get_matches_estimated() << std::endl; for (auto it = result.begin(); it != result.end(); ++it) { Xapian::Document doc = it.get_document(); std::string data = doc.get_data(); double doc_score_weight = it.get_weight(); /// 匹配百分比 int doc_score_percent = it.get_percent(); std::cout << "doc=" << data << ",weight=" << doc_score_weight << ",percent=" << doc_score_percent << std::endl; }
percent就是 int doc_score_percent = it.get_percent(); 这里获取的文档匹配百分比。
void MultiMatch::get_mset(Xapian::doccount first, Xapian::doccount maxitems, Xapian::doccount check_at_least, Xapian::MSet & mset, Xapian::Weight::Internal & stats, const Xapian::MatchDecider *mdecider, const Xapian::KeyMaker *sorter) { ...... { /// greatest_wt_subqs_matched 表示最大的匹配query数 /// total_subqs 表示总query数
/// percent_scale是计算percent的一个因子,后面会看到怎么用
percent_scale = greatest_wt_subqs_matched / double(total_subqs); percent_scale /= greatest_wt; } ...... }
int MSet::Internal::convert_to_percent_internal(double wt) const { LOGCALL(MATCH, int, "Xapian::MSet::Internal::convert_to_percent_internal", wt); if (percent_factor == ) { RETURN(100); } /// wt是文档的打分,percent_factor是之前计算的 percent_scale * 100 // Excess precision on x86 can result in a difference here. double v = wt * percent_factor + 100.0 * DBL_EPSILON; int pcent = static_cast<int>(v); LOGLINE(MATCH, "wt = " << wt << ", max_possible = " << max_possible << " => pcent = " << pcent); if (pcent > 100) pcent = 100; if (pcent < ) pcent = ; if (pcent == && wt > ) pcent = 1; RETURN(pcent); }
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26692020/viewspace-3123487/ ,如需转载,请注明出处,否则将追究法律责任。