Index: include/xapian/queryparser.h
===================================================================
--- include/xapian/queryparser.h	(revision 7603)
+++ include/xapian/queryparser.h	(working copy)
@@ -181,9 +181,13 @@
      *  @param flags         Zero or more Query::feature_flag specifying
      *		what features the QueryParser should support.  Combine
      *		multiple values with bitwise-or (|).
+     *	@param default_prefix  The default term prefix to use (default none).
+     *		For example, you might use this to parse a "Author" field with
+     *		an implicit author: prefix.
      */
     Query parse_query(const std::string &query_string,
-		      unsigned flags = FLAG_PHRASE|FLAG_BOOLEAN|FLAG_LOVEHATE);
+		      unsigned flags = FLAG_PHRASE|FLAG_BOOLEAN|FLAG_LOVEHATE,
+		      const std::string &default_prefix = "");
 
     /** Add a probabilistic term prefix.
      *
Index: queryparser/queryparser.lemony
===================================================================
--- queryparser/queryparser.lemony	(revision 7603)
+++ queryparser/queryparser.lemony	(working copy)
@@ -217,6 +217,6 @@
 
 Query
-QueryParser::Internal::parse_query(const string &qs, unsigned flags)
+QueryParser::Internal::parse_query(const string &qs, unsigned flags, const string &default_prefix)
 {
     char ubuf[6];
 #ifndef NDEBUG
@@ -241,8 +243,8 @@
     State state(this, flags);
 
     list<string> prefix_stack;
-    // Simplify reading the current prefix by pushing an empty string.
-    prefix_stack.push_back("");
+    // We always have the current prefix on the top of the stack.
+    prefix_stack.push_back(default_prefix);
 
     enum {
 	DEFAULT, IN_QUOTES, IN_PREFIXED_QUOTES, IN_PHRASED_TERM
Index: queryparser/queryparser_internal.cc
===================================================================
--- queryparser/queryparser_internal.cc	(revision 7603)
+++ queryparser/queryparser_internal.cc	(working copy)
@@ -217,6 +217,6 @@
 
 Query
-QueryParser::Internal::parse_query(const string &qs, unsigned flags)
+QueryParser::Internal::parse_query(const string &qs, unsigned flags, const string &default_prefix)
 {
     char ubuf[6];
 #ifndef NDEBUG
@@ -241,8 +243,8 @@
     State state(this, flags);
 
     list<string> prefix_stack;
-    // Simplify reading the current prefix by pushing an empty string.
-    prefix_stack.push_back("");
+    // We always have the current prefix on the top of the stack.
+    prefix_stack.push_back(default_prefix);
 
     enum {
 	DEFAULT, IN_QUOTES, IN_PREFIXED_QUOTES, IN_PHRASED_TERM
Index: queryparser/queryparser_internal.h
===================================================================
--- queryparser/queryparser_internal.h	(revision 7603)
+++ queryparser/queryparser_internal.h	(working copy)
@@ -59,5 +59,5 @@
   public:
     Internal() : stem_action(STEM_NONE), stopper(NULL),
 	default_op(Xapian::Query::OP_OR), errmsg(NULL) { }
-    Xapian::Query parse_query(const string & query_string, unsigned int flags);
+    Xapian::Query parse_query(const string & query_string, unsigned int flags, const string & default_prefix);
 };
Index: queryparser/queryparser.cc
===================================================================
--- queryparser/queryparser.cc	(revision 7603)
+++ queryparser/queryparser.cc	(working copy)
@@ -116,16 +116,17 @@
 }
 
 Query
-QueryParser::parse_query(const string &query_string, unsigned flags)
+QueryParser::parse_query(const string &query_string, unsigned flags,
+			 const string &default_prefix)
 {
     internal->unstem.clear();
     internal->errmsg = NULL;
 
     if (query_string.empty()) return Query();
 
-    Query result = internal->parse_query(query_string, flags);
+    Query result = internal->parse_query(query_string, flags, default_prefix);
     if (internal->errmsg && strcmp(internal->errmsg, "parse error") == 0) {
-	result = internal->parse_query(query_string, 0);
+	result = internal->parse_query(query_string, 0, default_prefix);
     }
 
     if (internal->errmsg) throw internal->errmsg;
