Index: wp-includes/query.php
===================================================================
--- wp-includes/query.php	(revision 21614)
+++ wp-includes/query.php	(working copy)
@@ -2185,10 +2185,14 @@
 				preg_match_all('/".*?("|$)|((?<=[\r\n\t ",+])|^)[^\r\n\t ",+]+/', $q['s'], $matches);
 				$q['search_terms'] = array_map('_search_terms_tidy', $matches[0]);
 			}
+			$q['search_terms'] = array_filter( (array) $q['search_terms'] );
+
 			$n = !empty($q['exact']) ? '' : '%';
 			$searchand = '';
-			foreach( (array) $q['search_terms'] as $term ) {
+			$search_orderby_title = array();
+			foreach ( $q['search_terms'] as $term ) {
 				$term = esc_sql( like_escape( $term ) );
+				$search_orderby_title[] = "$wpdb->posts.post_title LIKE '%$term%'";
 				$search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
 				$searchand = ' AND ';
 			}
@@ -2377,6 +2381,38 @@
 				$orderby .= " {$q['order']}";
 		}
 
+		// Order search results by relevance
+		if ( !empty( $search_orderby_title ) && empty( $q['exact'] ) ) {
+			$num_terms = count($search_orderby_title);
+
+			if ( $num_terms > 1 ) {
+				$search_orderby_s = esc_sql( like_escape( $q['s'] ) );
+
+				$search_orderby = '(CASE ';
+				// sentence match in title
+				$search_orderby .= "WHEN $wpdb->posts.post_title LIKE '%$search_orderby_s%' THEN 1 ";
+
+				// sanity limit
+				if ( $num_terms < 7 ) {
+					// all words in title
+					$search_orderby .= 'WHEN ' . implode( ' AND ', $search_orderby_title ) . ' THEN 2 ';
+					// any word in title
+					$search_orderby .= 'WHEN ' . implode( ' OR ', $search_orderby_title ) . ' THEN 3 ';
+				}
+
+				// sentence match in content
+				$search_orderby .= "WHEN $wpdb->posts.post_content LIKE '%$search_orderby_s%' THEN 4 ";
+				$search_orderby .= 'ELSE 5 END)';
+			} else {
+				// single word or sentence search
+				$search_orderby = reset($search_orderby_title) . ' DESC';
+			}
+			// Allow plugins to add/remove/modify the 'order by' for the search section of the database query
+			$search_orderby = apply_filters_ref_array( 'posts_search_orderby', array( $search_orderby, &$this ) );
+			if ( $search_orderby )
+				$orderby = $orderby ? $search_orderby . ', ' . $orderby : $search_orderby;
+		}
+
 		if ( is_array( $post_type ) ) {
 			$post_type_cap = 'multiple_post_type';
 		} else {
