mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-08 14:51:49 +00:00
125606 rmunteanu: Merged 5.1.1 (5.1.1) to 5.1.N (5.1.2) 125515 slanglois: MNT-16155 Update source headers - add new Copyrights for Java and JSP source files + automatic check in the build git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@125788 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
206 lines
7.0 KiB
Java
206 lines
7.0 KiB
Java
/*
|
|
* #%L
|
|
* Alfresco Repository
|
|
* %%
|
|
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
|
* %%
|
|
* This file is part of the Alfresco software.
|
|
* If the software was purchased under a paid Alfresco license, the terms of
|
|
* the paid license agreement will prevail. Otherwise, the software is
|
|
* provided under the following open source license terms:
|
|
*
|
|
* Alfresco is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Alfresco is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
|
* #L%
|
|
*/
|
|
package org.apache.lucene.search;
|
|
|
|
/**
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
* (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import java.io.IOException;
|
|
import java.util.Set;
|
|
|
|
import org.apache.lucene.index.Term;
|
|
import org.apache.lucene.index.TermDocs;
|
|
import org.apache.lucene.index.IndexReader;
|
|
import org.apache.lucene.util.ToStringUtils;
|
|
|
|
/** A Query that matches documents containing a term.
|
|
This may be combined with other terms with a {@link BooleanQuery}.
|
|
*/
|
|
public class TermQuery extends Query {
|
|
private Term term;
|
|
|
|
private class TermWeight implements Weight {
|
|
private Similarity similarity;
|
|
private float value;
|
|
private float idf;
|
|
private float queryNorm;
|
|
private float queryWeight;
|
|
|
|
public TermWeight(Searcher searcher)
|
|
throws IOException {
|
|
this.similarity = getSimilarity(searcher);
|
|
idf = similarity.idf(term, searcher); // compute idf
|
|
}
|
|
|
|
public String toString() { return "weight(" + TermQuery.this + ")"; }
|
|
|
|
public Query getQuery() { return TermQuery.this; }
|
|
public float getValue() { return value; }
|
|
|
|
public float sumOfSquaredWeights() {
|
|
queryWeight = idf * getBoost(); // compute query weight
|
|
return queryWeight * queryWeight; // square it
|
|
}
|
|
|
|
public void normalize(float queryNorm) {
|
|
this.queryNorm = queryNorm;
|
|
queryWeight *= queryNorm; // normalize query weight
|
|
value = queryWeight * idf; // idf for document
|
|
}
|
|
|
|
public Scorer scorer(IndexReader reader) throws IOException {
|
|
TermDocs termDocs = reader.termDocs(term);
|
|
|
|
if (termDocs == null)
|
|
return null;
|
|
|
|
String field = term.field();
|
|
return new TermScorer(this, termDocs, similarity,
|
|
reader.hasNorms(field) ? reader.norms(field) : null);
|
|
}
|
|
|
|
public Explanation explain(IndexReader reader, int doc)
|
|
throws IOException {
|
|
|
|
ComplexExplanation result = new ComplexExplanation();
|
|
result.setDescription("weight("+getQuery()+" in "+doc+"), product of:");
|
|
|
|
Explanation idfExpl =
|
|
new Explanation(idf, "idf(docFreq=" + reader.docFreq(term) +
|
|
", numDocs=" + reader.numDocs() + ")");
|
|
|
|
// explain query weight
|
|
Explanation queryExpl = new Explanation();
|
|
queryExpl.setDescription("queryWeight(" + getQuery() + "), product of:");
|
|
|
|
Explanation boostExpl = new Explanation(getBoost(), "boost");
|
|
if (getBoost() != 1.0f)
|
|
queryExpl.addDetail(boostExpl);
|
|
queryExpl.addDetail(idfExpl);
|
|
|
|
Explanation queryNormExpl = new Explanation(queryNorm,"queryNorm");
|
|
queryExpl.addDetail(queryNormExpl);
|
|
|
|
queryExpl.setValue(boostExpl.getValue() *
|
|
idfExpl.getValue() *
|
|
queryNormExpl.getValue());
|
|
|
|
result.addDetail(queryExpl);
|
|
|
|
// explain field weight
|
|
String field = term.field();
|
|
ComplexExplanation fieldExpl = new ComplexExplanation();
|
|
fieldExpl.setDescription("fieldWeight("+term+" in "+doc+
|
|
"), product of:");
|
|
|
|
Explanation tfExpl = scorer(reader).explain(doc);
|
|
fieldExpl.addDetail(tfExpl);
|
|
fieldExpl.addDetail(idfExpl);
|
|
|
|
Explanation fieldNormExpl = new Explanation();
|
|
byte[] fieldNorms = reader.norms(field);
|
|
float fieldNorm =
|
|
fieldNorms!=null ? Similarity.decodeNorm(fieldNorms[doc]) : 0.0f;
|
|
fieldNormExpl.setValue(fieldNorm);
|
|
fieldNormExpl.setDescription("fieldNorm(field="+field+", doc="+doc+")");
|
|
fieldExpl.addDetail(fieldNormExpl);
|
|
|
|
fieldExpl.setMatch(Boolean.valueOf(tfExpl.isMatch()));
|
|
fieldExpl.setValue(tfExpl.getValue() *
|
|
idfExpl.getValue() *
|
|
fieldNormExpl.getValue());
|
|
|
|
result.addDetail(fieldExpl);
|
|
result.setMatch(fieldExpl.getMatch());
|
|
|
|
// combine them
|
|
result.setValue(queryExpl.getValue() * fieldExpl.getValue());
|
|
|
|
if (queryExpl.getValue() == 1.0f)
|
|
return fieldExpl;
|
|
|
|
return result;
|
|
}
|
|
}
|
|
|
|
/** Constructs a query for the term <code>t</code>. */
|
|
public TermQuery(Term t) {
|
|
term = t;
|
|
}
|
|
|
|
/** Returns the term of this query. */
|
|
public Term getTerm() { return term; }
|
|
|
|
protected Weight createWeight(Searcher searcher) throws IOException {
|
|
return new TermWeight(searcher);
|
|
}
|
|
|
|
public void extractTerms(Set terms) {
|
|
terms.add(getTerm());
|
|
}
|
|
|
|
/** Prints a user-readable version of this query. */
|
|
public String toString(String field) {
|
|
StringBuffer buffer = new StringBuffer();
|
|
if (!term.field().equals(field)) {
|
|
buffer.append(term.field());
|
|
buffer.append(":");
|
|
}
|
|
buffer.append(term.text());
|
|
buffer.append(ToStringUtils.boost(getBoost()));
|
|
return buffer.toString();
|
|
}
|
|
|
|
/** Returns true iff <code>o</code> is equal to this. */
|
|
public boolean equals(Object o) {
|
|
if (!(o instanceof TermQuery))
|
|
return false;
|
|
TermQuery other = (TermQuery)o;
|
|
return (this.getBoost() == other.getBoost())
|
|
&& this.term.equals(other.term);
|
|
}
|
|
|
|
/** Returns a hash code value for this object.*/
|
|
public int hashCode() {
|
|
return Float.floatToIntBits(getBoost()) ^ term.hashCode();
|
|
}
|
|
|
|
}
|