Search: allow setting weights on terms, ie: "important"2.5
This commit is contained in:
@@ -278,7 +278,8 @@ bool SearchData::toNativeQuery(Rcl::Db &db, void *d)
|
||||
xq = xq.empty() ? tq : Xapian::Query(Xapian::Query::OP_AND_NOT, xq, tq);
|
||||
}
|
||||
|
||||
// Add the directory filtering clause
|
||||
// Add the directory filtering clause. This is a phrase of terms
|
||||
// prefixed with the pathelt prefix XP
|
||||
if (!m_topdir.empty()) {
|
||||
vector<string> vpath;
|
||||
stringToTokens(m_topdir, vpath, "/");
|
||||
@@ -288,10 +289,21 @@ bool SearchData::toNativeQuery(Rcl::Db &db, void *d)
|
||||
it != vpath.end(); it++){
|
||||
pvpath.push_back(pathelt_prefix + *it);
|
||||
}
|
||||
xq = Xapian::Query(m_topdirexcl ?
|
||||
Xapian::Query::OP_AND_NOT:Xapian::Query::OP_FILTER,
|
||||
xq, Xapian::Query(Xapian::Query::OP_PHRASE,
|
||||
pvpath.begin(), pvpath.end()));
|
||||
Xapian::Query::op tdop;
|
||||
if (m_topdirweight == 1.0) {
|
||||
tdop = m_topdirexcl ?
|
||||
Xapian::Query::OP_AND_NOT : Xapian::Query::OP_FILTER;
|
||||
} else {
|
||||
tdop = m_topdirexcl ?
|
||||
Xapian::Query::OP_AND_NOT : Xapian::Query::OP_AND_MAYBE;
|
||||
}
|
||||
Xapian::Query tdq = Xapian::Query(Xapian::Query::OP_PHRASE,
|
||||
pvpath.begin(), pvpath.end());
|
||||
if (m_topdirweight != 1.0)
|
||||
tdq = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT,
|
||||
tdq, m_topdirweight);
|
||||
|
||||
xq = Xapian::Query(tdop, xq, tdq);
|
||||
}
|
||||
|
||||
*((Xapian::Query *)d) = xq;
|
||||
@@ -847,8 +859,7 @@ bool SearchDataClauseSimple::toNativeQuery(Rcl::Db &db, void *p,
|
||||
(m_parentSearch == 0 && !m_haveWildCards);
|
||||
|
||||
StringToXapianQ tr(db, m_field, l_stemlang, doBoostUserTerm);
|
||||
if (!tr.processUserString(m_text, m_reason, pqueries,
|
||||
db.getStopList()))
|
||||
if (!tr.processUserString(m_text, m_reason, pqueries, db.getStopList()))
|
||||
return false;
|
||||
if (pqueries.empty()) {
|
||||
LOGERR(("SearchDataClauseSimple: resolved to null query\n"));
|
||||
@@ -858,6 +869,9 @@ bool SearchDataClauseSimple::toNativeQuery(Rcl::Db &db, void *p,
|
||||
tr.getUTerms(m_uterms);
|
||||
//listVector("SearchDataClauseSimple: Uterms: ", m_uterms);
|
||||
*qp = Xapian::Query(op, pqueries.begin(), pqueries.end());
|
||||
if (m_weight != 1.0) {
|
||||
*qp = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, *qp, m_weight);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -887,6 +901,9 @@ bool SearchDataClauseFilename::toNativeQuery(Rcl::Db &db, void *p,
|
||||
more.end());
|
||||
*qp = qp->empty() ? tq : Xapian::Query(Xapian::Query::OP_AND, *qp, tq);
|
||||
}
|
||||
if (m_weight != 1.0) {
|
||||
*qp = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, *qp, m_weight);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -932,6 +949,9 @@ bool SearchDataClauseDist::toNativeQuery(Rcl::Db &db, void *p,
|
||||
tr.getTerms(m_terms, m_groups);
|
||||
tr.getUTerms(m_uterms);
|
||||
*qp = *pqueries.begin();
|
||||
if (m_weight != 1.0) {
|
||||
*qp = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, *qp, m_weight);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -73,8 +73,8 @@ class SearchDataClause;
|
||||
class SearchData {
|
||||
public:
|
||||
SearchData(SClType tp)
|
||||
: m_tp(tp), m_topdirexcl(false), m_haveDates(false),
|
||||
m_haveWildCards(false)
|
||||
: m_tp(tp), m_topdirexcl(false), m_topdirweight(1.0),
|
||||
m_haveDates(false), m_haveWildCards(false)
|
||||
{
|
||||
if (m_tp != SCLT_OR && m_tp != SCLT_AND)
|
||||
m_tp = SCLT_OR;
|
||||
@@ -104,10 +104,11 @@ public:
|
||||
bool maybeAddAutoPhrase();
|
||||
|
||||
/** Set/get top subdirectory for filtering results */
|
||||
void setTopdir(const string& t, bool excl = false)
|
||||
void setTopdir(const string& t, bool excl = false, float w = 1.0)
|
||||
{
|
||||
m_topdir = t;
|
||||
m_topdirexcl = excl;
|
||||
m_topdirweight = w;
|
||||
}
|
||||
|
||||
/** Set date span for filtering results */
|
||||
@@ -147,6 +148,7 @@ private:
|
||||
vector<string> m_nfiletypes; // Unwanted file types
|
||||
string m_topdir; // Restrict to subtree.
|
||||
bool m_topdirexcl; // Invert meaning
|
||||
float m_topdirweight; // affect weight instead of filter
|
||||
bool m_haveDates;
|
||||
DateInterval m_dates; // Restrict to date interval
|
||||
// Printable expanded version of the complete query, retrieved/set
|
||||
@@ -167,7 +169,7 @@ public:
|
||||
|
||||
SearchDataClause(SClType tp)
|
||||
: m_tp(tp), m_parentSearch(0), m_haveWildCards(0),
|
||||
m_modifiers(SDCM_NONE)
|
||||
m_modifiers(SDCM_NONE), m_weight(1.0)
|
||||
{}
|
||||
virtual ~SearchDataClause() {}
|
||||
virtual bool toNativeQuery(Rcl::Db &db, void *, const string&) = 0;
|
||||
@@ -180,7 +182,7 @@ public:
|
||||
SClType getTp() {return m_tp;}
|
||||
void setParent(SearchData *p) {m_parentSearch = p;}
|
||||
virtual void setModifiers(Modifier mod) {m_modifiers = mod;}
|
||||
|
||||
virtual void setWeight(float w) {m_weight = w;}
|
||||
friend class SearchData;
|
||||
|
||||
protected:
|
||||
@@ -189,6 +191,7 @@ protected:
|
||||
SearchData *m_parentSearch;
|
||||
bool m_haveWildCards;
|
||||
Modifier m_modifiers;
|
||||
float m_weight;
|
||||
private:
|
||||
SearchDataClause(const SearchDataClause&) {}
|
||||
SearchDataClause& operator=(const SearchDataClause&) {
|
||||
|
||||
Reference in New Issue
Block a user