TermQuery.java
001 package gate.creole.annic.apache.lucene.search;
002 
003 /**
004  * Copyright 2004 The Apache Software Foundation
005  *
006  * Licensed under the Apache License, Version 2.0 (the "License");
007  * you may not use this file except in compliance with the License.
008  * You may obtain a copy of the License at
009  *
010  *     http://www.apache.org/licenses/LICENSE-2.0
011  *
012  * Unless required by applicable law or agreed to in writing, software
013  * distributed under the License is distributed on an "AS IS" BASIS,
014  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015  * See the License for the specific language governing permissions and
016  * limitations under the License.
017  */
018 
019 import java.io.IOException;
020 import gate.creole.annic.apache.lucene.index.Term;
021 import gate.creole.annic.apache.lucene.index.TermDocs;
022 import gate.creole.annic.apache.lucene.index.IndexReader;
023 
024 /** A Query that matches documents containing a term.
025   This may be combined with other terms with a {@link BooleanQuery}.
026   */
027 @SuppressWarnings("serial")
028 public class TermQuery extends Query {
029   private Term term;
030 
031   private class TermWeight implements Weight {
032     private Searcher searcher;
033     private float value;
034     private float idf;
035     private float queryNorm;
036     private float queryWeight;
037 
038     public TermWeight(Searcher searcher) {
039       this.searcher = searcher;
040     }
041 
042     @Override
043     public String toString() { return "weight(" + TermQuery.this ")"}
044 
045     @Override
046     public Query getQuery() { return TermQuery.this}
047     @Override
048     public float getValue() { return value; }
049 
050     @Override
051     public float sumOfSquaredWeights() throws IOException {
052       idf = getSimilarity(searcher).idf(term, searcher)// compute idf
053       queryWeight = idf * getBoost();             // compute query weight
054       return queryWeight * queryWeight;           // square it
055     }
056 
057     @Override
058     public void normalize(float queryNorm) {
059       this.queryNorm = queryNorm;
060       queryWeight *= queryNorm;                   // normalize query weight
061       value = queryWeight * idf;                  // idf for document
062     }
063 
064     @Override
065     public Scorer scorer(IndexReader reader, Searcher searcherthrows IOException {
066       this.searcher = searcher;
067       TermDocs termDocs = reader.termDocs(term);
068 
069       if (termDocs == null)
070         return null;
071 
072       return new TermScorer(this, termDocs, getSimilarity(searcher),
073                             reader.norms(term.field()), term);
074     }
075 
076     @Override
077     public Explanation explain(IndexReader reader, int doc)
078       throws IOException {
079 
080       Explanation result = new Explanation();
081       result.setDescription("weight("+getQuery()+" in "+doc+"), product of:");
082 
083       Explanation idfExpl =
084         new Explanation(idf, "idf(docFreq=" + searcher.docFreq(term")");
085 
086       // explain query weight
087       Explanation queryExpl = new Explanation();
088       queryExpl.setDescription("queryWeight(" + getQuery() "), product of:");
089 
090       Explanation boostExpl = new Explanation(getBoost()"boost");
091       if (getBoost() != 1.0f)
092         queryExpl.addDetail(boostExpl);
093       queryExpl.addDetail(idfExpl);
094 
095       Explanation queryNormExpl = new Explanation(queryNorm,"queryNorm");
096       queryExpl.addDetail(queryNormExpl);
097 
098       queryExpl.setValue(boostExpl.getValue() *
099                          idfExpl.getValue() *
100                          queryNormExpl.getValue());
101 
102       result.addDetail(queryExpl);
103 
104       // explain field weight
105       String field = term.field();
106       Explanation fieldExpl = new Explanation();
107       fieldExpl.setDescription("fieldWeight("+term+" in "+doc+
108                                "), product of:");
109 
110       Explanation tfExpl = scorer(reader, this.searcher).explain(doc);
111       fieldExpl.addDetail(tfExpl);
112       fieldExpl.addDetail(idfExpl);
113 
114       Explanation fieldNormExpl = new Explanation();
115       byte[] fieldNorms = reader.norms(field);
116       float fieldNorm =
117         fieldNorms!=null ? Similarity.decodeNorm(fieldNorms[doc]) 0.0f;
118       fieldNormExpl.setValue(fieldNorm);
119       fieldNormExpl.setDescription("fieldNorm(field="+field+", doc="+doc+")");
120       fieldExpl.addDetail(fieldNormExpl);
121 
122       fieldExpl.setValue(tfExpl.getValue() *
123                          idfExpl.getValue() *
124                          fieldNormExpl.getValue());
125 
126       result.addDetail(fieldExpl);
127 
128       // combine them
129       result.setValue(queryExpl.getValue() * fieldExpl.getValue());
130 
131       if (queryExpl.getValue() == 1.0f)
132         return fieldExpl;
133 
134       return result;
135     }
136   }
137 
138   /** Constructs a query for the term <code>t</code>. */
139   public TermQuery(Term t) {
140     term = t;
141   }
142 
143   /** Returns the term of this query. */
144   public Term getTerm() { return term; }
145 
146   @Override
147   protected Weight createWeight(Searcher searcher) {
148     return new TermWeight(searcher);
149   }
150 
151   /** Prints a user-readable version of this query. */
152   @Override
153   public String toString(String field) {
154     StringBuffer buffer = new StringBuffer();
155     if (!term.field().equals(field)) {
156       buffer.append(term.field());
157       buffer.append(":");
158     }
159     buffer.append(term.text());
160     if (getBoost() != 1.0f) {
161       buffer.append("^");
162       buffer.append(Float.toString(getBoost()));
163     }
164     return buffer.toString();
165   }
166 
167   /** Returns true iff <code>o</code> is equal to this. */
168   @Override
169   public boolean equals(Object o) {
170     if (!(instanceof TermQuery))
171       return false;
172     TermQuery other = (TermQuery)o;
173     try {
174       throw new Exception("My Error");
175     catch(Exception e) {
176       e.printStackTrace();
177     }
178 
179     return (this.getBoost() == other.getBoost())
180       && this.term.equals(other.term);
181   }
182 
183   /** Returns a hash code value for this object.*/
184   @Override
185   public int hashCode() {
186     return Float.floatToIntBits(getBoost()) ^ term.hashCode();
187   }
188 
189 }