Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        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
            }
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        /// <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);
            }
        }
Esempio n. 6
0
 protected virtual void SetBoostValue(Query query, float? boost)
 {
     if (!boost.HasValue)
     {
         return;
     }
     query.SetBoost(boost.Value);
 }
Esempio n. 7
0
 /// <summary>
 ///  设置Query权重
 /// </summary>
 /// <param name="query"></param>
 /// <param name="boostLevel"></param>
 private void SetBoost(Query query, BoostLevel boostLevel)
 {
     query.SetBoost((float)boostLevel);
 }