diff --git src/js/_enqueues/wp/updates.js src/js/_enqueues/wp/updates.js
index ee5bf3cc58..593cac908c 100644
--- src/js/_enqueues/wp/updates.js
+++ src/js/_enqueues/wp/updates.js
@@ -67,6 +67,15 @@
 	 */
 	wp.updates.searchTerm = '';
 
+	/**
+	 * Minimum number of characters before an ajax search is fired.
+	 *
+	 * @since 5.4.0
+	 *
+	 * @type {number}
+	 */
+	wp.updates.searchMinCharacters = 2;
+
 	/**
 	 * Whether filesystem credentials need to be requested from the user.
 	 *
@@ -2169,6 +2178,9 @@
 			$pluginInstallSearch.attr( 'aria-describedby', 'live-search-desc' );
 		}
 
+		// Track the previous search string length.
+		var previousSearchStringLength = 0;
+
 		/**
 		 * Handles changes to the plugin search box on the new-plugin page,
 		 * searching the repository dynamically.
@@ -2176,7 +2188,8 @@
 		 * @since 4.6.0
 		 */
 		$pluginInstallSearch.on( 'keyup input', _.debounce( function( event, eventtype ) {
-			var $searchTab = $( '.plugin-install-search' ), data, searchLocation;
+			var $searchTab = $( '.plugin-install-search' ), data, searchLocation,
+				searchStringLength = $pluginInstallSearch.val().length;
 
 			data = {
 				_ajax_nonce: wp.updates.ajaxNonce,
@@ -2187,6 +2200,23 @@
 			};
 			searchLocation = location.href.split( '?' )[ 0 ] + '?' + $.param( _.omit( data, [ '_ajax_nonce', 'pagenow' ] ) );
 
+			// Set the autocomplete attribute, turning off autocomplete 1 character before ajax search kicks in.
+			if ( 0 === searchStringLength || searchStringLength < wp.updates.searchMinCharacters ) {
+				$pluginInstallSearch.attr( 'autocomplete', 'on' );
+			} else {
+				$pluginInstallSearch.attr( 'autocomplete', 'off' );
+			}
+
+			// Only search when user has typed a a minimum number of characters (default 2).
+			if (
+				0 !== searchStringLength &&
+				searchStringLength < wp.updates.searchMinCharacters &&
+				previousSearchStringLength < wp.updates.searchMinCharacters
+			) {
+				return;
+			}
+			previousSearchStringLength = searchStringLength;
+
 			// Clear on escape.
 			if ( 'keyup' === event.type && 27 === event.which ) {
 				event.target.value = '';
@@ -2240,6 +2270,7 @@
 
 		if ( $pluginSearch.length ) {
 			$pluginSearch.attr( 'aria-describedby', 'live-search-desc' );
+
 		}
 
 		/**
@@ -2255,7 +2286,25 @@
 				pagenow:       pagenow,
 				plugin_status: 'all'
 			},
-			queryArgs;
+			queryArgs,
+			searchStringLength = $pluginSearch.val().length;
+
+			// Set the autocomplete attribute, turning off autocomplete 1 character before ajax search kicks in.
+			if ( 0 === searchStringLength || searchStringLength < wp.updates.searchMinCharacters - 1 ) {
+				$pluginSearch.attr( 'autocomplete', 'on' );
+			} else {
+				$pluginSearch.attr( 'autocomplete', 'off' );
+			}
+
+			// Only search when user has typed a a minimum number of characters (default 2).
+			if (
+				0 !== searchStringLength &&
+				searchStringLength < wp.updates.searchMinCharacters &&
+				previousSearchStringLength < wp.updates.searchMinCharacters
+			) {
+				return;
+			}
+			previousSearchStringLength = searchStringLength;
 
 			// Clear on escape.
 			if ( 'keyup' === event.type && 27 === event.which ) {
