Ejemplo n.º 1
0
            public override Scorer Scorer(IndexReader reader, bool scoreDocsInOrder, bool topScorer, IState state)
            {
                Similarity similarity = _parent.GetSimilarity(_searcher);

                if (_parent.Matches.Count > 128)
                {
                    return(new LazyInitInScorer(_parent, reader, state, similarity));
                }

                var scorers = ArrayPool <Scorer> .Shared.Rent(_parent.Matches.Count);

                int index = 0;

                byte[] norms = reader.Norms(_parent.Field, state);
                foreach (var match in _parent.Matches)
                {
                    var termDocs = reader.TermDocs(new Term(_parent.Field, match), state);
                    var scorer   = new TermScorer(this, termDocs, similarity, norms);
                    if (scorer.NextDoc(state) != DocIdSetIterator.NO_MORE_DOCS)
                    {
                        scorers[index++] = scorer;
                    }
                }
                return(new SharedArrayDisjunctionMaxScorer(1.0f, similarity, scorers, index));
            }
Ejemplo n.º 2
0
        public virtual void TestSkipTo()
        {
            Term      allTerm   = new Term(FIELD, "all");
            TermQuery termQuery = new TermQuery(allTerm);

            Weight weight = termQuery.Weight(IndexSearcher);

            TermScorer ts = new TermScorer(weight, indexReader.TermDocs(allTerm), IndexSearcher.Similarity, indexReader.Norms(FIELD));

            Assert.IsTrue(ts.Advance(3) != DocIdSetIterator.NO_MORE_DOCS, "Didn't skip");
            //The next doc should be doc 5
            Assert.IsTrue(ts.DocID() == 5, "doc should be number 5");
        }
Ejemplo n.º 3
0
        public virtual void TestNext()
        {
            Term      allTerm   = new Term(FIELD, "all");
            TermQuery termQuery = new TermQuery(allTerm);

            Weight weight = termQuery.Weight(IndexSearcher);

            TermScorer ts = new TermScorer(weight, indexReader.TermDocs(allTerm), IndexSearcher.Similarity, indexReader.Norms(FIELD));

            Assert.IsTrue(ts.NextDoc() != DocIdSetIterator.NO_MORE_DOCS, "next did not return a doc");
            Assert.IsTrue(ts.Score() == 1.6931472f, "score is not correct");
            Assert.IsTrue(ts.NextDoc() != DocIdSetIterator.NO_MORE_DOCS, "next did not return a doc");
            Assert.IsTrue(ts.Score() == 1.6931472f, "score is not correct");
            Assert.IsTrue(ts.NextDoc() == DocIdSetIterator.NO_MORE_DOCS, "next returned a doc and it should not have");
        }
Ejemplo n.º 4
0
        public virtual void Test()
        {
            Term      allTerm   = new Term(FIELD, "all");
            TermQuery termQuery = new TermQuery(allTerm);

            Weight weight = termQuery.Weight(IndexSearcher);

            TermScorer ts = new TermScorer(weight, indexReader.TermDocs(allTerm), IndexSearcher.Similarity, indexReader.Norms(FIELD));

            //we have 2 documents with the term all in them, one document for all the other values
            System.Collections.IList docs = new System.Collections.ArrayList();
            //must call next first


            ts.Score(new AnonymousClassCollector(docs, this));
            Assert.IsTrue(docs.Count == 2, "docs Size: " + docs.Count + " is not: " + 2);
            TestHit doc0 = (TestHit)docs[0];
            TestHit doc5 = (TestHit)docs[1];

            //The scores should be the same
            Assert.IsTrue(doc0.Score == doc5.Score, doc0.Score + " does not equal: " + doc5.Score);

            /*
             *          Score should be (based on Default Sim.:
             *          All floats are approximate
             *          tf = 1
             *          numDocs = 6
             *          docFreq(all) = 2
             *          idf = ln(6/3) + 1 = 1.693147
             *          idf ^ 2 = 2.8667
             *          boost = 1
             *          lengthNorm = 1 //there is 1 term in every document
             *          coord = 1
             *          sumOfSquaredWeights = (idf * boost) ^ 2 = 1.693147 ^ 2 = 2.8667
             *          queryNorm = 1 / (sumOfSquaredWeights)^0.5 = 1 /(1.693147) = 0.590
             *
             *          score = 1 * 2.8667 * 1 * 1 * 0.590 = 1.69
             *
             */
            Assert.IsTrue(doc0.Score == 1.6931472f, doc0.Score + " does not equal: " + 1.6931472f);
        }