You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by go...@apache.org on 2004/09/15 11:38:50 UTC
cvs commit: jakarta-lucene/src/java/org/apache/lucene/search PhrasePrefixQuery.java
goller 2004/09/15 02:38:50
Modified: src/java/org/apache/lucene/search PhrasePrefixQuery.java
Log:
PhraseQuery and PhrasePrefixQuery are extended. It's now
possible to specify the relative position of a term within
a phrase. This allows gaps and multiple terms at the same
position.
Revision Changes Path
1.14 +42 -13 jakarta-lucene/src/java/org/apache/lucene/search/PhrasePrefixQuery.java
Index: PhrasePrefixQuery.java
===================================================================
RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/search/PhrasePrefixQuery.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- PhrasePrefixQuery.java 27 Aug 2004 20:20:47 -0000 1.13
+++ PhrasePrefixQuery.java 15 Sep 2004 09:38:50 -0000 1.14
@@ -19,6 +19,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.Vector;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.MultipleTermPositions;
@@ -40,6 +41,7 @@
public class PhrasePrefixQuery extends Query {
private String field;
private ArrayList termArrays = new ArrayList();
+ private Vector positions = new Vector();
private int slop = 0;
@@ -64,18 +66,45 @@
* @see PhraseQuery#add(Term)
*/
public void add(Term[] terms) {
- if (termArrays.size() == 0)
- field = terms[0].field();
-
- for (int i=0; i<terms.length; i++) {
- if (terms[i].field() != field) {
- throw new IllegalArgumentException
- ("All phrase terms must be in the same field (" + field + "): "
- + terms[i]);
- }
- }
+ int position = 0;
+ if(positions.size() > 0)
+ position = ((Integer) positions.lastElement()).intValue() + 1;
+
+ add(terms, position);
+ }
+
+ /**
+ * Allows to specify the relative position of terms within the phrase.
+ *
+ * @ see PhraseQuery#add(Term, int)
+ * @param terms
+ * @param position
+ */
+ public void add(Term[] terms, int position) {
+ if (termArrays.size() == 0)
+ field = terms[0].field();
+
+ for (int i=0; i<terms.length; i++) {
+ if (terms[i].field() != field) {
+ throw new IllegalArgumentException
+ ("All phrase terms must be in the same field (" + field + "): "
+ + terms[i]);
+ }
+ }
- termArrays.add(terms);
+ termArrays.add(terms);
+ positions.addElement(new Integer(position));
+ }
+
+ /**
+ * Returns the relative positions of terms in this phrase.
+ * @return
+ */
+ public int[] getPositions() {
+ int[] result = new int[positions.size()];
+ for(int i = 0; i < positions.size(); i++)
+ result[i] = ((Integer) positions.elementAt(i)).intValue();
+ return result;
}
private class PhrasePrefixWeight implements Weight {
@@ -131,10 +160,10 @@
}
if (slop == 0)
- return new ExactPhraseScorer(this, tps, getSimilarity(searcher),
+ return new ExactPhraseScorer(this, tps, getPositions(), getSimilarity(searcher),
reader.norms(field));
else
- return new SloppyPhraseScorer(this, tps, getSimilarity(searcher),
+ return new SloppyPhraseScorer(this, tps, getPositions(), getSimilarity(searcher),
slop, reader.norms(field));
}
---------------------------------------------------------------------
To unsubscribe, e-mail: lucene-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: lucene-dev-help@jakarta.apache.org