Skip to content

Commit c076768

Browse files
committed
Altered the simple backend to only search textual fields. This makes the backend work consistently across all databases and is likely the desired behavior anyhow. Thanks to kylemacfarlane for the report.
1 parent bbe65ed commit c076768

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

haystack/backends/simple_backend.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,19 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
5757
qs = model.objects.all()
5858
else:
5959
for term in query_string.split():
60-
queries = [
61-
Q(**{'%s__icontains' % field.name: term}) for field in model._meta._fields() if not hasattr(field, 'related')
62-
]
60+
queries = []
61+
62+
for field in model._meta._fields():
63+
if hasattr(field, 'related'):
64+
continue
65+
66+
if not field.get_internal_type() in ('TextField', 'CharField', 'SlugField'):
67+
continue
68+
69+
queries.append(Q(**{'%s__icontains' % field.name: term}))
70+
6371
qs = model.objects.filter(reduce(lambda x, y: x|y, queries))
72+
6473
hits += len(qs)
6574
results.extend([match for match in qs])
6675

tests/simple_tests/tests/simple_backend.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@ class SimpleMockSearchIndex(indexes.SearchIndex):
1414

1515
class SimpleSearchBackendTestCase(TestCase):
1616
fixtures = ['bulk_data.json']
17-
17+
1818
def setUp(self):
1919
super(SimpleSearchBackendTestCase, self).setUp()
20-
20+
2121
self.site = SearchSite()
2222
self.backend = SearchBackend(site=self.site)
2323
self.index = SimpleMockSearchIndex(MockModel, backend=self.backend)
2424
self.site.register(MockModel, SimpleMockSearchIndex)
25-
25+
2626
self.sample_objs = MockModel.objects.all()
27-
27+
2828
def test_update(self):
2929
self.backend.update(self.index, self.sample_objs)
3030

@@ -37,23 +37,23 @@ def test_clear(self):
3737
def test_search(self):
3838
# No query string should always yield zero results.
3939
self.assertEqual(self.backend.search(u''), {'hits': 0, 'results': []})
40-
40+
4141
self.assertEqual(self.backend.search(u'*')['hits'], 23)
4242
self.assertEqual([result.pk for result in self.backend.search(u'*')['results']], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
43-
43+
4444
self.assertEqual(self.backend.search(u'daniel')['hits'], 23)
4545
self.assertEqual([result.pk for result in self.backend.search(u'daniel')['results']], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
46-
46+
4747
self.assertEqual(self.backend.search(u'should be a string')['hits'], 1)
4848
self.assertEqual([result.pk for result in self.backend.search(u'should be a string')['results']], [8])
49-
49+
5050
self.assertEqual(self.backend.search(u'index document')['hits'], 6)
5151
self.assertEqual([result.pk for result in self.backend.search(u'index document')['results']], [2, 3, 15, 16, 17, 18])
52-
52+
5353
# No support for spelling suggestions
5454
self.assertEqual(self.backend.search(u'Indx')['hits'], 0)
5555
self.assertFalse(self.backend.search(u'Indx').get('spelling_suggestion'))
56-
56+
5757
# No support for facets
5858
self.assertEqual(self.backend.search(u'', facets=['name']), {'hits': 0, 'results': []})
5959
self.assertEqual(self.backend.search(u'daniel', facets=['name'])['hits'], 23)
@@ -64,6 +64,9 @@ def test_search(self):
6464
self.assertFalse(self.backend.search(u'').get('facets'))
6565
self.assertFalse(self.backend.search(u'daniel').get('facets'))
6666

67+
# Note that only textual-fields are supported.
68+
self.assertEqual(self.backend.search(u'2009-06-18')['hits'], 0)
69+
6770
def test_more_like_this(self):
6871
self.backend.update(self.index, self.sample_objs)
6972
self.assertEqual(self.backend.search(u'*')['hits'], 23)

0 commit comments

Comments
 (0)