Index: wp-includes/comment.php
===================================================================
--- wp-includes/comment.php	(revision 20554)
+++ wp-includes/comment.php	(working copy)
@@ -222,8 +222,11 @@
 			'type' => '',
 			'user_id' => '',
 			'search' => '',
+			'search_wild' => 'both',
+			'search_columns' => array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_content' ),
 			'count' => false
 		);
+		if( isset( $query_vars['search_columns'] ) ) $query_vars['search_columns'] = array_intersect( $query_vars['search_columns'], $defaults['search_columns'] ); 
 
 		$this->query_vars = wp_parse_args( $query_vars, $defaults );
 		do_action_ref_array( 'pre_get_comments', array( &$this ) );
@@ -322,7 +325,7 @@
 		if ( '' !== $user_id )
 			$where .= $wpdb->prepare( ' AND user_id = %d', $user_id );
 		if ( '' !== $search )
-			$where .= $this->get_search_sql( $search, array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_content' ) );
+			$where .= $this->get_search_sql( $search, $search_columns, $search_wild );
 
 		$post_fields = array_filter( compact( array( 'post_author', 'post_name', 'post_parent', 'post_status', 'post_type', ) ) );
 		if ( ! empty( $post_fields ) ) {
@@ -337,7 +340,7 @@
 			$$piece = isset( $clauses[ $piece ] ) ? $clauses[ $piece ] : '';
 
 		$query = "SELECT $fields FROM $wpdb->comments $join WHERE $where ORDER BY $orderby $order $limits";
-
+		do_action_ref_array( 'pre_comment_query', array( &$query ) );
 		if ( $count )
 			return $wpdb->get_var( $query );
 
@@ -357,16 +360,21 @@
 	 *
 	 * @param string $string
 	 * @param array $cols
+	 * @param string $wild Allowing wildcard searches, false, leading, trailing, or both.
 	 * @return string
 	 */
-	function get_search_sql( $string, $cols ) {
-		$string = esc_sql( like_escape( $string ) );
+	function get_search_sql( $string, $cols, $wild = false ) {
+		$string = esc_sql( $string );
 
 		$searches = array();
-		foreach ( $cols as $col )
-			$searches[] = "$col LIKE '%$string%'";
+		$leading_wild = ( 'leading' == $wild || 'both' == $wild ) ? '%' : '';
+		$trailing_wild = ( 'trailing' == $wild || 'both' == $wild ) ? '%' : '';
 
-		return ' AND (' . implode(' OR ', $searches) . ')';
+		foreach ( $cols as $col ) {
+			$searches[] = "$col LIKE '$leading_wild" . like_escape( $string ) . "$trailing_wild'";
+		}
+
+		return ' AND (' . implode( ' OR ', $searches ) . ')';
 	}
 }
 
Index: wp-admin/includes/class-wp-comments-list-table.php
===================================================================
--- wp-admin/includes/class-wp-comments-list-table.php	(revision 20554)
+++ wp-admin/includes/class-wp-comments-list-table.php	(working copy)
@@ -50,6 +50,8 @@
 		$comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';
 
 		$search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : '';
+		$search_wild = ( isset( $_REQUEST['s_wild'] ) ) ? $_REQUEST['s_wild'] : '';
+		$search_columns = ( isset( $_REQUEST['s_columns'] ) ) ? $_REQUEST['s_columns'] : '';
 
 		$user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : '';
 
@@ -87,6 +89,7 @@
 		$args = array(
 			'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status,
 			'search' => $search,
+			'search_wild' => $search_wild ? $search_wild : 'both',
 			'user_id' => $user_id,
 			'offset' => $start,
 			'number' => $number,
@@ -95,6 +98,8 @@
 			'orderby' => $orderby,
 			'order' => $order,
 		);
+		// Only set $args['search_columns'] if $search_columns exists so that default columns override otherwise
+		if( $search_columns ) $args['search_columns'] = (array) $search_columns;
 
 		$_comments = get_comments( $args );
 
@@ -462,7 +467,7 @@
 			}
 			echo '<a href="edit-comments.php?s=';
 			comment_author_IP();
-			echo '&amp;mode=detail';
+			echo '&amp;mode=detail&amp;s_wild=none&amp;s_columns=comment_author_IP';
 			if ( 'spam' == $comment_status )
 				echo '&amp;comment_status=spam';
 			echo '">';
