Index: tests/phpunit/tests/query/search.php
===================================================================
--- tests/phpunit/tests/query/search.php	(revision 0)
+++ tests/phpunit/tests/query/search.php	(revision 0)
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * Test search query vars, without any initial posts in the database
+ *
+ * @group query
+ * @group search
+ */
+class Tests_Query_Search extends WP_UnitTestCase {
+	protected $q;
+
+	function setUp() {
+		parent::setUp();
+
+		unset( $this->q );
+		$this->q = new WP_Query();
+	}
+
+	function test_search_fields_filter() {
+		$p1 = $this->factory->post->create( array( 'post_title' => 'Burrito' ) );
+		$p2 = $this->factory->post->create( array( 'post_content' => 'Burrito' ) );
+		$p3 = $this->factory->post->create( array( 'post_excerpt' => 'Burrito' ) );
+
+		add_filter( 'search_fields', array( $this, 'filter_search_fields' ) );
+		$posts = $this->q->query( array(
+			'fields' => 'ids',
+			's' => 'Burrito'
+		) );
+		$this->assertEquals( array( $p3 ), $posts );
+		remove_filter( 'search_fields', array( $this, 'filter_search_fields' ) );
+
+		add_filter( 'search_fields', array( $this, 'empty_search_fields' ) );
+		$posts2 = $this->q->query( array(
+			'fields' => 'ids',
+			's' => 'Burrito'
+		) );
+		$this->assertEqualSets( array( $p3, $p2, $p1 ), $posts2 );
+		remove_filter( 'search_fields', array( $this, 'empty_search_fields' ) );
+	}
+
+	function filter_search_fields() {
+		global $wpdb;
+		return array( "$wpdb->posts.post_excerpt" );
+	}
+
+	function empty_search_fields() {
+		return array();
+	}
+}
\ No newline at end of file
Index: src/wp-includes/query.php
===================================================================
--- src/wp-includes/query.php	(revision 25277)
+++ src/wp-includes/query.php	(working copy)
@@ -2233,12 +2233,18 @@
 				preg_match_all('/".*?("|$)|((?<=[\r\n\t ",+])|^)[^\r\n\t ",+]+/', $q['s'], $matches);
 				$q['search_terms'] = array_map('_search_terms_tidy', $matches[0]);
 			}
-			$n = !empty($q['exact']) ? '' : '%';
+			$n = ! empty( $q['exact'] ) ? '' : '%';
 			$searchand = '';
-			foreach( (array) $q['search_terms'] as $term ) {
-				$term = esc_sql( like_escape( $term ) );
-				$search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
-				$searchand = ' AND ';
+			$search_fields = apply_filters( 'search_fields', array( "$wpdb->posts.post_title", "$wpdb->posts.post_content" ) );
+
+			if ( ! empty( $search_fields ) && is_array( $search_fields ) ) {
+				foreach( (array) $q['search_terms'] as $term ) {
+					$term = esc_sql( like_escape( $term ) );
+					foreach ( $search_fields as &$s )
+						$s = "({$s} LIKE '{$n}{$term}{$n}')";
+					$search .= sprintf( '%s(%s)', $searchand, implode( ' OR ', $search_fields  ) );
+					$searchand = ' AND ';
+				}
 			}
 
 			if ( !empty($search) ) {
