public virtual void TestBoost() { // NOTE: uses index build in *this* setUp IndexReader reader = IndexReader.Open(small); IndexSearcher search = new IndexSearcher(reader); // test for correct application of query normalization // must use a non score normalizing method for this. Query q = Csrq("data", "1", "6", T, T); q.SetBoost(100); search.Search(q, null, new AnonymousClassCollector(this)); // // Ensure that boosting works to score one clause of a query higher // than another. // Query q1 = Csrq("data", "A", "A", T, T); // matches document #0 q1.SetBoost(.1f); Query q2 = Csrq("data", "Z", "Z", T, T); // matches document #1 BooleanQuery bq = new BooleanQuery(true); bq.Add(q1, BooleanClause.Occur.SHOULD); bq.Add(q2, BooleanClause.Occur.SHOULD); ScoreDoc[] hits = search.Search(bq, null, 1000).scoreDocs; Assert.AreEqual(1, hits[0].doc); Assert.AreEqual(0, hits[1].doc); Assert.IsTrue(hits[0].score > hits[1].score); q1 = Csrq("data", "A", "A", T, T, MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE); // matches document #0 q1.SetBoost(.1f); q2 = Csrq("data", "Z", "Z", T, T, MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE); // matches document #1 bq = new BooleanQuery(true); bq.Add(q1, BooleanClause.Occur.SHOULD); bq.Add(q2, BooleanClause.Occur.SHOULD); hits = search.Search(bq, null, 1000).scoreDocs; Assert.AreEqual(1, hits[0].doc); Assert.AreEqual(0, hits[1].doc); Assert.IsTrue(hits[0].score > hits[1].score); q1 = Csrq("data", "A", "A", T, T); // matches document #0 q1.SetBoost(10f); q2 = Csrq("data", "Z", "Z", T, T); // matches document #1 bq = new BooleanQuery(true); bq.Add(q1, BooleanClause.Occur.SHOULD); bq.Add(q2, BooleanClause.Occur.SHOULD); hits = search.Search(bq, null, 1000).scoreDocs; Assert.AreEqual(0, hits[0].doc); Assert.AreEqual(1, hits[1].doc); Assert.IsTrue(hits[0].score > hits[1].score); }
/// <summary>macro </summary> protected internal virtual Query Tq(System.String f, System.String t, float b) { Query q = Tq(f, t); q.SetBoost(b); return(q); }
public override Query Rewrite(IndexReader reader) { if (minNrShouldMatch == 0 && clauses.Count == 1) { // optimize 1-clause queries BooleanClause c = (BooleanClause)clauses[0]; if (!c.IsProhibited()) { // just return clause Query query = c.GetQuery().Rewrite(reader); // rewrite first if (GetBoost() != 1.0f) { // incorporate boost if (query == c.GetQuery()) { // if rewrite was no-op query = (Query)query.Clone(); // then clone before boost } query.SetBoost(GetBoost() * query.GetBoost()); } return(query); } } BooleanQuery clone = null; // recursively rewrite for (int i = 0; i < clauses.Count; i++) { BooleanClause c = (BooleanClause)clauses[i]; Query query = c.GetQuery().Rewrite(reader); if (query != c.GetQuery()) { // clause rewrote: must clone if (clone == null) { clone = (BooleanQuery)this.Clone(); } clone.clauses[i] = new BooleanClause(query, c.GetOccur()); } } if (clone != null) { return(clone); // some clauses rewrote } else { return(this); // no clauses rewrote } }
/// <summary>check very basic hashCode and equals </summary> public static void CheckHashEquals(Query q) { Query q2 = (Query)q.Clone(); CheckEqual(q, q2); Query q3 = (Query)q.Clone(); q3.SetBoost(7.21792348f); CheckUnequal(q, q3); // test that a class check is done so that no exception is thrown // in the implementation of equals() Query whacky = new AnonymousClassQuery(); whacky.SetBoost(q.GetBoost()); CheckUnequal(q, whacky); }
/// <summary>Optimize our representation and our subqueries representations</summary> /// <param name="reader">the IndexReader we query /// </param> /// <returns> an optimized copy of us (which may not be a copy if there is nothing to optimize) /// </returns> public override Query Rewrite(IndexReader reader) { int numDisjunctions = disjuncts.Count; if (numDisjunctions == 1) { Query singleton = (Query)disjuncts[0]; Query result = singleton.Rewrite(reader); if (GetBoost() != 1.0f) { if (result == singleton) { result = (Query)result.Clone(); } result.SetBoost(GetBoost() * result.GetBoost()); } return(result); } DisjunctionMaxQuery clone = null; for (int i = 0; i < numDisjunctions; i++) { Query clause = (Query)disjuncts[i]; Query rewrite = clause.Rewrite(reader); if (rewrite != clause) { if (clone == null) { clone = (DisjunctionMaxQuery)this.Clone(); } clone.disjuncts[i] = rewrite; } } if (clone != null) { return(clone); } else { return(this); } }
protected virtual void SetBoostValue(Query query, float? boost) { if (!boost.HasValue) { return; } query.SetBoost(boost.Value); }
/// <summary> /// 设置Query权重 /// </summary> /// <param name="query"></param> /// <param name="boostLevel"></param> private void SetBoost(Query query, BoostLevel boostLevel) { query.SetBoost((float)boostLevel); }