Index: MultiFieldQueryParser.java
===================================================================
--- MultiFieldQueryParser.java	(revision 424734)
+++ MultiFieldQueryParser.java	(working copy)
@@ -24,18 +24,42 @@
 import org.apache.lucene.search.Query;
 
 import java.util.Vector;
+import java.io.Serializable;
 
 /**
  * A QueryParser which constructs queries to search multiple fields.
  *
- * @author <a href="mailto:kelvin@relevanz.com">Kelvin Tan</a>, Daniel Naber
+ * @author <a href="mailto:kelvin@relevanz.com">Kelvin Tan</a>, Daniel Naber, Karl Wettin
  * @version $Revision$
  */
 public class MultiFieldQueryParser extends QueryParser
 {
-  
-  private String[] fields;
 
+  public static class FieldSetting {
+    private float boostMultiplicator = 1f;
+    private String fieldName;
+
+    public FieldSetting(String fieldName) {
+      this.fieldName = fieldName;
+      this.boostMultiplicator = 1f;
+    }
+
+    public FieldSetting(String fieldName, float boostMultiplicator) {
+      this.fieldName = fieldName;
+      this.boostMultiplicator = boostMultiplicator;
+    }
+
+    public String getFieldName() {
+      return fieldName;
+    }
+
+    public float getBoostMultiplicator() {
+      return boostMultiplicator;
+    }
+  }
+
+  private FieldSetting[] fields;
+
   /**
    * Creates a MultiFieldQueryParser.
    *
@@ -57,16 +81,29 @@
    * what fields they appear.</p>
    */
   public MultiFieldQueryParser(String[] fields, Analyzer analyzer) {
+    this(convert(fields), analyzer);
+  }
+
+  public MultiFieldQueryParser(FieldSetting[] fields, Analyzer analyzer) {
     super(null, analyzer);
     this.fields = fields;
   }
-  
+
+  private static FieldSetting[] convert(String[] fields) {
+    FieldSetting[] fieldSettings = new FieldSetting[fields.length];
+    for (int i=0; i<fields.length; i++) {
+      fieldSettings[i] = new FieldSetting(fields[i], 1f);
+    }
+    return fieldSettings;
+  }
+
   protected Query getFieldQuery(String field, String queryText, int slop) throws ParseException {
     if (field == null) {
       Vector clauses = new Vector();
       for (int i = 0; i < fields.length; i++) {
-        Query q = super.getFieldQuery(fields[i], queryText);
+        Query q = super.getFieldQuery(fields[i].getFieldName(), queryText);
         if (q != null) {
+          q.setBoost(q.getBoost() * fields[i].getBoostMultiplicator());
           if (q instanceof PhraseQuery) {
             ((PhraseQuery) q).setSlop(slop);
           }
@@ -82,8 +119,8 @@
     }
     return super.getFieldQuery(field, queryText);
   }
-  
 
+
   protected Query getFieldQuery(String field, String queryText) throws ParseException {
     return getFieldQuery(field, queryText, 0);
   }
@@ -94,8 +131,9 @@
     if (field == null) {
       Vector clauses = new Vector();
       for (int i = 0; i < fields.length; i++) {
-        clauses.add(new BooleanClause(super.getFuzzyQuery(fields[i], termStr, minSimilarity),
-            BooleanClause.Occur.SHOULD));
+        Query q = super.getFuzzyQuery(fields[i].getFieldName(), termStr, minSimilarity);
+        q.setBoost(q.getBoost() * fields[i].getBoostMultiplicator());
+        clauses.add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
       }
       return getBooleanQuery(clauses, true);
     }
@@ -107,8 +145,9 @@
     if (field == null) {
       Vector clauses = new Vector();
       for (int i = 0; i < fields.length; i++) {
-        clauses.add(new BooleanClause(super.getPrefixQuery(fields[i], termStr),
-            BooleanClause.Occur.SHOULD));
+        Query q = super.getPrefixQuery(fields[i].getFieldName(), termStr);
+        q.setBoost(q.getBoost() * fields[i].getBoostMultiplicator());
+        clauses.add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
       }
       return getBooleanQuery(clauses, true);
     }
@@ -119,29 +158,35 @@
     if (field == null) {
       Vector clauses = new Vector();
       for (int i = 0; i < fields.length; i++) {
-        clauses.add(new BooleanClause(super.getWildcardQuery(fields[i], termStr),
-            BooleanClause.Occur.SHOULD));
+        Query q = super.getWildcardQuery(fields[i].getFieldName(), termStr);
+        q.setBoost(q.getBoost() * fields[i].getBoostMultiplicator());
+        clauses.add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
       }
       return getBooleanQuery(clauses, true);
     }
     return super.getWildcardQuery(field, termStr);
   }
 
- 
+
   protected Query getRangeQuery(String field, String part1, String part2, boolean inclusive) throws ParseException {
     if (field == null) {
       Vector clauses = new Vector();
       for (int i = 0; i < fields.length; i++) {
-        clauses.add(new BooleanClause(super.getRangeQuery(fields[i], part1, part2, inclusive),
-            BooleanClause.Occur.SHOULD));
+        Query q = super.getRangeQuery(fields[i].getFieldName(), part1, part2, inclusive);
+        q.setBoost(q.getBoost() * fields[i].getBoostMultiplicator());
+        clauses.add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
       }
       return getBooleanQuery(clauses, true);
     }
     return super.getRangeQuery(field, part1, part2, inclusive);
   }
- 
 
 
+  public static Query parse(String[] queries, String[] fields,
+                            Analyzer analyzer) throws ParseException
+  {
+      return parse(queries, convert(fields), analyzer);
+  }
 
   /**
    * Parses a query which searches on the fields specified.
@@ -159,22 +204,28 @@
    * @throws IllegalArgumentException if the length of the queries array differs
    *  from the length of the fields array
    */
-  public static Query parse(String[] queries, String[] fields,
-      Analyzer analyzer) throws ParseException
+  public static Query parse(String[] queries, FieldSetting[] fields,
+                            Analyzer analyzer) throws ParseException
   {
     if (queries.length != fields.length)
       throw new IllegalArgumentException("queries.length != fields.length");
     BooleanQuery bQuery = new BooleanQuery();
     for (int i = 0; i < fields.length; i++)
     {
-      QueryParser qp = new QueryParser(fields[i], analyzer);
+      QueryParser qp = new QueryParser(fields[i].getFieldName(), analyzer);
       Query q = qp.parse(queries[i]);
+      q.setBoost(q.getBoost() * fields[i].getBoostMultiplicator());
       bQuery.add(q, BooleanClause.Occur.SHOULD);
     }
     return bQuery;
   }
 
 
+  public static Query parse(String query, String[] fields,
+                            BooleanClause.Occur[] flags, Analyzer analyzer) throws ParseException {
+      return parse(query, convert(fields), flags, analyzer);
+  }
+
   /**
    * Parses a query, searching on the fields specified.
    * Use this if you need to specify certain fields as required,
@@ -205,20 +256,26 @@
    * @throws IllegalArgumentException if the length of the fields array differs
    *  from the length of the flags array
    */
-  public static Query parse(String query, String[] fields,
-      BooleanClause.Occur[] flags, Analyzer analyzer) throws ParseException {
+  public static Query parse(String query, FieldSetting[] fields,
+                            BooleanClause.Occur[] flags, Analyzer analyzer) throws ParseException {
     if (fields.length != flags.length)
       throw new IllegalArgumentException("fields.length != flags.length");
     BooleanQuery bQuery = new BooleanQuery();
     for (int i = 0; i < fields.length; i++) {
-      QueryParser qp = new QueryParser(fields[i], analyzer);
+      QueryParser qp = new QueryParser(fields[i].getFieldName(), analyzer);
       Query q = qp.parse(query);
+      q.setBoost(q.getBoost() * fields[i].getBoostMultiplicator());
       bQuery.add(q, flags[i]);
     }
     return bQuery;
   }
 
-  
+  public static Query parse(String[] queries, String[] fields, BooleanClause.Occur[] flags,
+                            Analyzer analyzer) throws ParseException {
+      return parse(queries, convert(fields), flags, analyzer);
+  }
+
+
   /**
    * Parses a query, searching on the fields specified.
    * Use this if you need to specify certain fields as required,
@@ -250,16 +307,17 @@
    * @throws IllegalArgumentException if the length of the queries, fields,
    *  and flags array differ
    */
-  public static Query parse(String[] queries, String[] fields, BooleanClause.Occur[] flags,
-      Analyzer analyzer) throws ParseException
+  public static Query parse(String[] queries, FieldSetting[] fields, BooleanClause.Occur[] flags,
+                            Analyzer analyzer) throws ParseException
   {
     if (!(queries.length == fields.length && queries.length == flags.length))
       throw new IllegalArgumentException("queries, fields, and flags array have have different length");
     BooleanQuery bQuery = new BooleanQuery();
     for (int i = 0; i < fields.length; i++)
     {
-      QueryParser qp = new QueryParser(fields[i], analyzer);
+      QueryParser qp = new QueryParser(fields[i].getFieldName(), analyzer);
       Query q = qp.parse(queries[i]);
+      q.setBoost(q.getBoost() * fields[i].getBoostMultiplicator());
       bQuery.add(q, flags[i]);
     }
     return bQuery;
