Skip to content

Commit 129bc0c

Browse files
committed
Added an settings override on HAYSTACK_LIMIT_TO_REGISTERED_MODELS as a possible performance optimization.
1 parent ba62960 commit 129bc0c

File tree

10 files changed

+71
-11
lines changed

10 files changed

+71
-11
lines changed

docs/searchbackend_api.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ specific to each one.
5656
``search``
5757
----------
5858

59-
.. method:: SearchBackend.search(self, query_string, sort_by=None, start_offset=0, end_offset=None, fields='', highlight=False, facets=None, date_facets=None, query_facets=None, narrow_queries=None, spelling_query=None, limit_to_registered_models=True, **kwargs)
59+
.. method:: SearchBackend.search(self, query_string, sort_by=None, start_offset=0, end_offset=None, fields='', highlight=False, facets=None, date_facets=None, query_facets=None, narrow_queries=None, spelling_query=None, limit_to_registered_models=None, **kwargs)
6060

6161
Takes a query to search on and returns dictionary.
6262

docs/settings.rst

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,3 +280,22 @@ An example::
280280
HAYSTACK_ITERATOR_LOAD_PER_QUERY = 100
281281

282282
The default is 10 results at a time.
283+
284+
285+
``HAYSTACK_LIMIT_TO_REGISTERED_MODELS``
286+
=======================================
287+
288+
**Optional**
289+
290+
This setting allows you to control whether or not Haystack will limit the
291+
search results seen to just the models registered. It should be a boolean.
292+
293+
If your search index is never used for anything other than the models
294+
registered with Haystack, you can turn this off and get a small to moderate
295+
performance boost.
296+
297+
An example::
298+
299+
HAYSTACK_LIMIT_TO_REGISTERED_MODELS = False
300+
301+
Default is ``True``.

haystack/backends/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def clear(self, models=[], commit=True):
114114
def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
115115
fields='', highlight=False, facets=None, date_facets=None, query_facets=None,
116116
narrow_queries=None, spelling_query=None,
117-
limit_to_registered_models=True, **kwargs):
117+
limit_to_registered_models=None, **kwargs):
118118
"""
119119
Takes a query to search on and returns dictionary.
120120

haystack/backends/dummy_backend.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def clear(self, models=[], commit=True):
4343
def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
4444
fields='', highlight=False, facets=None, date_facets=None, query_facets=None,
4545
narrow_queries=None, spelling_query=None,
46-
limit_to_registered_models=True, **kwargs):
46+
limit_to_registered_models=None, **kwargs):
4747
if query_string == '(content__exact hello AND content__exact world)':
4848
return {
4949
'results': [DummySearchResult('haystack', 'dummymodel', 1, 1.5)],
@@ -60,7 +60,7 @@ def prep_value(self, db_field, value):
6060

6161
def more_like_this(self, model_instance, additional_query_string=None,
6262
start_offset=0, end_offset=None,
63-
limit_to_registered_models=True, **kwargs):
63+
limit_to_registered_models=None, **kwargs):
6464
return {
6565
'results': [],
6666
'hits': 0

haystack/backends/simple_backend.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def clear(self, models=[], commit=True):
4747
def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
4848
fields='', highlight=False, facets=None, date_facets=None, query_facets=None,
4949
narrow_queries=None, spelling_query=None,
50-
limit_to_registered_models=True, **kwargs):
50+
limit_to_registered_models=None, **kwargs):
5151
hits = 0
5252
results = []
5353

@@ -74,7 +74,7 @@ def prep_value(self, db_field, value):
7474

7575
def more_like_this(self, model_instance, additional_query_string=None,
7676
start_offset=0, end_offset=None,
77-
limit_to_registered_models=True, **kwargs):
77+
limit_to_registered_models=None, **kwargs):
7878
return {
7979
'results': [],
8080
'hits': 0

haystack/backends/solr_backend.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def clear(self, models=[], commit=True):
106106
def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
107107
fields='', highlight=False, facets=None, date_facets=None, query_facets=None,
108108
narrow_queries=None, spelling_query=None,
109-
limit_to_registered_models=True, **kwargs):
109+
limit_to_registered_models=None, **kwargs):
110110
if len(query_string) == 0:
111111
return {
112112
'results': [],
@@ -165,6 +165,9 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
165165
kwargs['facet'] = 'on'
166166
kwargs['facet.query'] = ["%s:%s" % (field, value) for field, value in query_facets]
167167

168+
if limit_to_registered_models is None:
169+
limit_to_registered_models = getattr(settings, 'HAYSTACK_LIMIT_TO_REGISTERED_MODELS', True)
170+
168171
if limit_to_registered_models:
169172
# Using narrow queries, limit the results to only models registered
170173
# with the current site.
@@ -189,7 +192,7 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
189192

190193
def more_like_this(self, model_instance, additional_query_string=None,
191194
start_offset=0, end_offset=None,
192-
limit_to_registered_models=True, **kwargs):
195+
limit_to_registered_models=None, **kwargs):
193196
# Handle deferred models.
194197
if get_proxied_model and hasattr(model_instance, '_deferred') and model_instance._deferred:
195198
model_klass = get_proxied_model(model_instance._meta)
@@ -210,6 +213,9 @@ def more_like_this(self, model_instance, additional_query_string=None,
210213

211214
narrow_queries = set()
212215

216+
if limit_to_registered_models is None:
217+
limit_to_registered_models = getattr(settings, 'HAYSTACK_LIMIT_TO_REGISTERED_MODELS', True)
218+
213219
if limit_to_registered_models:
214220
# Using narrow queries, limit the results to only models registered
215221
# with the current site.

haystack/backends/whoosh_backend.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ def optimize(self):
219219
def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
220220
fields='', highlight=False, facets=None, date_facets=None, query_facets=None,
221221
narrow_queries=None, spelling_query=None,
222-
limit_to_registered_models=True, **kwargs):
222+
limit_to_registered_models=None, **kwargs):
223223
if not self.setup_complete:
224224
self.setup()
225225

@@ -282,6 +282,9 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
282282
narrowed_results = None
283283
self.index = self.index.refresh()
284284

285+
if limit_to_registered_models is None:
286+
limit_to_registered_models = getattr(settings, 'HAYSTACK_LIMIT_TO_REGISTERED_MODELS', True)
287+
285288
if limit_to_registered_models:
286289
# Using narrow queries, limit the results to only models registered
287290
# with the current site.
@@ -342,7 +345,7 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
342345

343346
def more_like_this(self, model_instance, additional_query_string=None,
344347
start_offset=0, end_offset=None,
345-
limit_to_registered_models=True, **kwargs):
348+
limit_to_registered_models=None, **kwargs):
346349
warnings.warn("Whoosh does not handle More Like This.", Warning, stacklevel=2)
347350
return {
348351
'results': [],

tests/core/tests/mocks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def clear(self, models=[], commit=True):
3535
def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
3636
fields='', highlight=False, facets=None, date_facets=None, query_facets=None,
3737
narrow_queries=None, spelling_query=None,
38-
limit_to_registered_models=True, **kwargs):
38+
limit_to_registered_models=None, **kwargs):
3939
from haystack import site
4040
results = []
4141
hits = len(MOCK_SEARCH_RESULTS)

tests/solr_tests/tests/solr_backend.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,22 @@ def test_search(self):
232232
self.assertEqual(self.sb.search('', narrow_queries=set(['name:daniel1'])), {'hits': 0, 'results': []})
233233
results = self.sb.search('Index', narrow_queries=set(['name:daniel1']))
234234
self.assertEqual(results['hits'], 1)
235+
236+
# Check the use of ``limit_to_registered_models``.
237+
self.assertEqual(self.sb.search('', limit_to_registered_models=False), {'hits': 0, 'results': []})
238+
self.assertEqual(self.sb.search('*:*', limit_to_registered_models=False)['hits'], 3)
239+
self.assertEqual([result.pk for result in self.sb.search('*:*', limit_to_registered_models=False)['results']], ['1', '2', '3'])
240+
241+
# Stow.
242+
old_limit_to_registered_models = getattr(settings, 'HAYSTACK_LIMIT_TO_REGISTERED_MODELS', True)
243+
settings.HAYSTACK_LIMIT_TO_REGISTERED_MODELS = False
244+
245+
self.assertEqual(self.sb.search(''), {'hits': 0, 'results': []})
246+
self.assertEqual(self.sb.search('*:*')['hits'], 3)
247+
self.assertEqual([result.pk for result in self.sb.search('*:*')['results']], ['1', '2', '3'])
248+
249+
# Restore.
250+
settings.HAYSTACK_LIMIT_TO_REGISTERED_MODELS = old_limit_to_registered_models
235251

236252
def test_more_like_this(self):
237253
self.sb.update(self.smmi, self.sample_objs)

tests/whoosh_tests/tests/whoosh_backend.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,22 @@ def test_search(self):
174174
# self.assertEqual(self.sb.search('', narrow_queries=set(['name:daniel1'])), {'hits': 0, 'results': []})
175175
# results = self.sb.search('Index*', narrow_queries=set(['name:daniel1']))
176176
# self.assertEqual(results['hits'], 1)
177+
178+
# Check the use of ``limit_to_registered_models``.
179+
self.assertEqual(self.sb.search(u'', limit_to_registered_models=False), {'hits': 0, 'results': []})
180+
self.assertEqual(self.sb.search(u'*', limit_to_registered_models=False)['hits'], 23)
181+
self.assertEqual([result.pk for result in self.sb.search(u'*', limit_to_registered_models=False)['results']], [u'23', u'22', u'21', u'20', u'19', u'18', u'17', u'16', u'15', u'14', u'13', u'12', u'11', u'10', u'9', u'8', u'7', u'6', u'5', u'4', u'3', u'2', u'1'])
182+
183+
# Stow.
184+
old_limit_to_registered_models = getattr(settings, 'HAYSTACK_LIMIT_TO_REGISTERED_MODELS', True)
185+
settings.HAYSTACK_LIMIT_TO_REGISTERED_MODELS = False
186+
187+
self.assertEqual(self.sb.search(u''), {'hits': 0, 'results': []})
188+
self.assertEqual(self.sb.search(u'*')['hits'], 23)
189+
self.assertEqual([result.pk for result in self.sb.search(u'*')['results']], [u'23', u'22', u'21', u'20', u'19', u'18', u'17', u'16', u'15', u'14', u'13', u'12', u'11', u'10', u'9', u'8', u'7', u'6', u'5', u'4', u'3', u'2', u'1'])
190+
191+
# Restore.
192+
settings.HAYSTACK_LIMIT_TO_REGISTERED_MODELS = old_limit_to_registered_models
177193

178194
def test_more_like_this(self):
179195
self.sb.update(self.smmi, self.sample_objs)

0 commit comments

Comments
 (0)