diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index 635330f..d441136 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -254,11 +254,14 @@ class ChangeList(object):
                 return "%s__icontains" % field_name
 
         if self.search_fields and self.query:
+            constructed_fields = [construct_search(str(field_name))
+                                  for field_name in self.search_fields]
             for bit in self.query.split():
-                or_queries = [models.Q(**{construct_search(str(field_name)): bit}) for field_name in self.search_fields]
+                or_queries = [models.Q(**{field_name: bit})
+                              for field_name in constructed_fields]
                 qs = qs.filter(reduce(operator.or_, or_queries))
             if not use_distinct:
-                for search_field in self.search_fields:
+                for search_field in constructed_fields:
                     field_name = search_field.split('__', 1)[0]
                     f = self.lookup_opts.get_field_by_name(field_name)[0]
                     if hasattr(f, 'rel') and isinstance(f.rel, models.ManyToManyRel):
diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py
index 9ac99cc..3b44f94 100644
--- a/tests/regressiontests/admin_views/models.py
+++ b/tests/regressiontests/admin_views/models.py
@@ -258,7 +258,7 @@ class PersonAdmin(admin.ModelAdmin):
     list_display = ('name', 'gender', 'alive')
     list_editable = ('gender', 'alive')
     list_filter = ('gender',)
-    search_fields = (u'name',)
+    search_fields = ('^name',)
     ordering = ["id"]
     save_as = True
 
@@ -445,7 +445,7 @@ class Recommendation(Title):
     recommender = models.ForeignKey(Recommender)
 
 class RecommendationAdmin(admin.ModelAdmin):
-    search_fields = ('titletranslation__text', 'recommender__titletranslation__text',)
+    search_fields = ('=titletranslation__text', '=recommender__titletranslation__text',)
 
 class Collector(models.Model):
     name = models.CharField(max_length=100)
diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py
index 6be07b4..545e7c4 100644
--- a/tests/regressiontests/admin_views/tests.py
+++ b/tests/regressiontests/admin_views/tests.py
@@ -1470,7 +1470,7 @@ class AdminViewListEditable(TestCase):
 
             "_save": "Save",
         }
-        self.client.post('/test_admin/admin/admin_views/person/?q=mauchly', data)
+        self.client.post('/test_admin/admin/admin_views/person/?q=john', data)
 
         self.assertEqual(Person.objects.get(name="John Mauchly").alive, False)
 
@@ -1680,7 +1680,8 @@ class AdminViewListEditable(TestCase):
 
 
 class AdminSearchTest(TestCase):
-    fixtures = ['admin-views-users','multiple-child-classes']
+    fixtures = ['admin-views-users', 'multiple-child-classes',
+                'admin-views-person']
 
     def setUp(self):
         self.client.login(username='super', password='secret')
@@ -1702,7 +1703,26 @@ class AdminSearchTest(TestCase):
         response = self.client.get('/test_admin/admin/auth/user/?q=joe&%s=username' % TO_FIELD_VAR)
         self.assertContains(response, "\n1 user\n")
         self.assertContains(response, '<input type="hidden" name="t" value="username"/>')
-
+    
+    def test_exact_matches(self):
+        response = self.client.get('/test_admin/admin/admin_views/recommendation/?q=bar')
+        # confirm the search returned 1 object
+        self.assertContains(response, "\n1 recommendation\n")
+        
+        response = self.client.get('/test_admin/admin/admin_views/recommendation/?q=ba')
+        # confirm the search returned 1 object
+        self.assertContains(response, "\n0 recommendations\n")
+        
+    def test_beginning_matches(self):
+        response = self.client.get('/test_admin/admin/admin_views/person/?q=Gui')
+        # confirm the search returned 1 object
+        self.assertContains(response, "\n1 person\n")
+        self.assertContains(response, "Guido")
+        
+        response = self.client.get('/test_admin/admin/admin_views/person/?q=uido')
+        # confirm the search returned 1 object
+        self.assertContains(response, "\n0 persons\n")
+        self.assertNotContains(response, "Guido")
 
 class AdminInheritedInlinesTest(TestCase):
     fixtures = ['admin-views-users.xml',]
