diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 5d96b97..c321489 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -5395,14 +5395,25 @@
                 }
 
                 if (uri.getPathSegments().size() > 2) {
-                    String filterParam = uri.getLastPathSegment();
-                    StringBuilder sb = new StringBuilder();
+                    final String filterParam = uri.getLastPathSegment();
+                    final boolean searchDisplayName = uri.getBooleanQueryParameter(
+                            Phone.SEARCH_DISPLAY_NAME_KEY, true);
+                    final boolean searchPhoneNumber = uri.getBooleanQueryParameter(
+                            Phone.SEARCH_PHONE_NUMBER_KEY, true);
+
+                    final StringBuilder sb = new StringBuilder();
                     sb.append(" AND (");
 
                     boolean hasCondition = false;
-                    final String ftsMatchQuery = SearchIndexManager.getFtsMatchQuery(
-                            filterParam, FtsQueryBuilder.UNSCOPED_NORMALIZING);
-                    if (ftsMatchQuery.length() > 0) {
+                    // TODO This only searches the name field.  Search other fields, such as
+                    // note, nickname, as well.  (Which should be disabled by default.)
+                    // Fix EMAILS_FILTER too.
+                    final String ftsMatchQuery =
+                            searchDisplayName
+                            ? SearchIndexManager.getFtsMatchQuery(filterParam,
+                                    FtsQueryBuilder.UNSCOPED_NORMALIZING)
+                            : null;
+                    if (!TextUtils.isEmpty(ftsMatchQuery)) {
                         sb.append(Data.RAW_CONTACT_ID + " IN " +
                                 "(SELECT " + RawContactsColumns.CONCRETE_ID +
                                 " FROM " + Tables.SEARCH_INDEX +
@@ -5415,35 +5426,37 @@
                         hasCondition = true;
                     }
 
-                    String number = PhoneNumberUtils.normalizeNumber(filterParam);
-                    if (!TextUtils.isEmpty(number)) {
-                        if (hasCondition) {
-                            sb.append(" OR ");
+                    if (searchPhoneNumber) {
+                        final String number = PhoneNumberUtils.normalizeNumber(filterParam);
+                        if (!TextUtils.isEmpty(number)) {
+                            if (hasCondition) {
+                                sb.append(" OR ");
+                            }
+                            sb.append(Data._ID +
+                                    " IN (SELECT DISTINCT " + PhoneLookupColumns.DATA_ID
+                                    + " FROM " + Tables.PHONE_LOOKUP
+                                    + " WHERE " + PhoneLookupColumns.NORMALIZED_NUMBER + " LIKE '");
+                            sb.append(number);
+                            sb.append("%')");
+                            hasCondition = true;
                         }
-                        sb.append(Data._ID +
-                                " IN (SELECT DISTINCT " + PhoneLookupColumns.DATA_ID
-                                + " FROM " + Tables.PHONE_LOOKUP
-                                + " WHERE " + PhoneLookupColumns.NORMALIZED_NUMBER + " LIKE '");
-                        sb.append(number);
-                        sb.append("%')");
-                        hasCondition = true;
-                    }
 
-                    if (!TextUtils.isEmpty(filterParam) && match == CALLABLES_FILTER) {
-                        // If the request is via Callable uri, Sip addresses matching the filter
-                        // parameter should be returned.
-                        if (hasCondition) {
-                            sb.append(" OR ");
+                        if (!TextUtils.isEmpty(filterParam) && match == CALLABLES_FILTER) {
+                            // If the request is via Callable uri, Sip addresses matching the filter
+                            // parameter should be returned.
+                            if (hasCondition) {
+                                sb.append(" OR ");
+                            }
+                            sb.append("(");
+                            sb.append(mimeTypeIsSipExpression);
+                            sb.append(" AND ((" + Data.DATA1 + " LIKE ");
+                            DatabaseUtils.appendEscapedSQLString(sb, filterParam + '%');
+                            sb.append(") OR (" + Data.DATA1 + " LIKE ");
+                            // Users may want SIP URIs starting from "sip:"
+                            DatabaseUtils.appendEscapedSQLString(sb, "sip:"+ filterParam + '%');
+                            sb.append(")))");
+                            hasCondition = true;
                         }
-                        sb.append("(");
-                        sb.append(mimeTypeIsSipExpression);
-                        sb.append(" AND ((" + Data.DATA1 + " LIKE ");
-                        DatabaseUtils.appendEscapedSQLString(sb, filterParam + '%');
-                        sb.append(") OR (" + Data.DATA1 + " LIKE ");
-                        // Users may want SIP URIs starting from "sip:"
-                        DatabaseUtils.appendEscapedSQLString(sb, "sip:"+ filterParam + '%');
-                        sb.append(")))");
-                        hasCondition = true;
                     }
 
                     if (!hasCondition) {
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index aa34b1a..5706925 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -1172,6 +1172,41 @@
         assertStoredValues(filterUri6, new ContentValues[] {values1, values2, values3} );
     }
 
+    public void testPhonesFilterSearchParams() {
+        final long rid1 = createRawContactWithName("Dad", null);
+        insertPhoneNumber(rid1, "123-456-7890");
+
+        final long rid2 = createRawContactWithName("Mam", null);
+        insertPhoneNumber(rid2, "323-123-4567");
+
+        // By default, "dad" will match both the display name and the phone number.
+        // Because "dad" is "323" after the dialpad conversion, it'll match "Mam" too.
+        assertStoredValues(
+                Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad").build(),
+                cv(Phone.DISPLAY_NAME, "Dad", Phone.NUMBER, "123-456-7890"),
+                cv(Phone.DISPLAY_NAME, "Mam", Phone.NUMBER, "323-123-4567")
+                );
+        assertStoredValues(
+                Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad")
+                    .appendQueryParameter(Phone.SEARCH_PHONE_NUMBER_KEY, "0")
+                    .build(),
+                cv(Phone.DISPLAY_NAME, "Dad", Phone.NUMBER, "123-456-7890")
+                );
+
+        assertStoredValues(
+                Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad")
+                    .appendQueryParameter(Phone.SEARCH_DISPLAY_NAME_KEY, "0")
+                    .build(),
+                cv(Phone.DISPLAY_NAME, "Mam", Phone.NUMBER, "323-123-4567")
+                );
+        assertStoredValues(
+                Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad")
+                    .appendQueryParameter(Phone.SEARCH_DISPLAY_NAME_KEY, "0")
+                    .appendQueryParameter(Phone.SEARCH_PHONE_NUMBER_KEY, "0")
+                    .build()
+                );
+    }
+
     public void testPhoneLookup() {
         ContentValues values = new ContentValues();
         values.put(RawContacts.CUSTOM_RINGTONE, "d");
