Merge branch 'kaedroho-search-auto-update'

pull/1358/head
Matt Westcott 2015-05-29 16:24:38 +01:00
commit f5218910c4
7 zmienionych plików z 105 dodań i 12 usunięć

Wyświetl plik

@ -53,6 +53,7 @@ Changelog
* Added a new decorator-based syntax for RoutablePage, compatible with Django 1.8
* Collapsible blocks stay open on any form error (Salvador Faria)
* Document upload modal no longer switches tabs on form errors (Salvador Faria)
* Added `AUTO_UPDATE` flag to search backend settings to enable/disable automatically updating the search index on model changes
0.8.8 (xx.xx.2015)

Wyświetl plik

@ -119,6 +119,7 @@ Search
------
* Search view accepts "page" GET parameter in line with pagination
* Added ``AUTO_UPDATE`` flag to search backend settings to enable/disable automatically updating the search index on model changes
Routable pages

Wyświetl plik

@ -7,13 +7,45 @@ Backends
Wagtailsearch has support for multiple backends giving you the choice between using the database for search or an external service such as Elasticsearch.
You can configure which backend to use with the ``WAGTAILSEARCH_BACKENDS`` setting.
You can configure which backend to use with the ``WAGTAILSEARCH_BACKENDS`` setting:
.. code-block:: python
WAGTAILSEARCH_BACKENDS = {
'default': {
'BACKEND': 'wagtail.wagtailsearch.backends.db.DBSearch',
}
}
``AUTO_UPDATE``
===============
By default, Wagtail will automatically keep all indexes up to date. This could impact performance when editing content, especially if your index is hosted on an external service.
The ``AUTO_UPDATE`` setting allows you to disable this on a per-index basis:
.. code-block:: python
WAGTAILSEARCH_BACKENDS = {
'default': {
'BACKEND': ...,
'AUTO_UPDATE': False,
}
}
If you have disabled auto update, you must run the :ref:`update_index` command on a regular basis to keep the index in sync with the database.
``BACKEND``
===========
Here's a list of backends that Wagtail supports out of the box.
.. _wagtailsearch_backends_database:
Database Backend (default)
==========================
--------------------------
``wagtail.wagtailsearch.backends.db.DBSearch``
@ -29,7 +61,7 @@ If any of these features are important to you, we recommend using Elasticsearch
Elasticsearch Backend
=====================
---------------------
``wagtail.wagtailsearch.backends.elasticsearch.ElasticSearch``
@ -71,6 +103,6 @@ If you prefer not to run an Elasticsearch server in development or production, t
Rolling Your Own
================
----------------
Wagtail search backends implement the interface defined in ``wagtail/wagtail/wagtailsearch/backends/base.py``. At a minimum, the backend's ``search()`` method must return a collection of objects or ``model.objects.none()``. For a fully-featured search backend, examine the Elasticsearch backend code in ``elasticsearch.py``.

Wyświetl plik

@ -150,6 +150,7 @@ try:
'BACKEND': 'wagtail.wagtailsearch.backends.elasticsearch.ElasticSearch',
'TIMEOUT': 10,
'max_retries': 1,
'AUTO_UPDATE': False,
}
if 'ELASTICSEARCH_URL' in os.environ:

Wyświetl plik

@ -51,9 +51,12 @@ def get_search_backend(backend='default', **kwargs):
return backend_cls(params)
def get_search_backends():
def get_search_backends(with_auto_update=False):
if hasattr(settings, 'WAGTAILSEARCH_BACKENDS'):
for backend in settings.WAGTAILSEARCH_BACKENDS.keys():
for backend, params in settings.WAGTAILSEARCH_BACKENDS.items():
if with_auto_update and params.get('AUTO_UPDATE', True) is False:
continue
yield get_search_backend(backend)
else:
yield get_search_backend('default')

Wyświetl plik

@ -20,7 +20,7 @@ def post_save_signal_handler(instance, **kwargs):
indexed_instance = get_indexed_instance(instance)
if indexed_instance:
for backend in get_search_backends():
for backend in get_search_backends(with_auto_update=True):
backend.add(indexed_instance)
@ -28,7 +28,7 @@ def post_delete_signal_handler(instance, **kwargs):
indexed_instance = get_indexed_instance(instance)
if indexed_instance:
for backend in get_search_backends():
for backend in get_search_backends(with_auto_update=True):
backend.delete(indexed_instance)

Wyświetl plik

@ -9,7 +9,7 @@ from django.core import management
from wagtail.tests.utils import WagtailTestUtils
from wagtail.tests.search import models
from wagtail.wagtailsearch.backends import get_search_backend, InvalidSearchBackendError
from wagtail.wagtailsearch.backends import get_search_backend, get_search_backends, InvalidSearchBackendError
from wagtail.wagtailsearch.backends.db import DBSearch
@ -132,9 +132,11 @@ class BackendTests(WagtailTestUtils):
self.assertEqual(set(results), {self.testa, self.testb, self.testc.searchtest_ptr, self.testd.searchtest_ptr})
@override_settings(WAGTAILSEARCH_BACKENDS={
'default': {'BACKEND': 'wagtail.wagtailsearch.backends.db.DBSearch'}
})
@override_settings(
WAGTAILSEARCH_BACKENDS={
'default': {'BACKEND': 'wagtail.wagtailsearch.backends.db.DBSearch'}
}
)
class TestBackendLoader(TestCase):
def test_import_by_name(self):
db = get_search_backend(backend='default')
@ -149,3 +151,56 @@ class TestBackendLoader(TestCase):
def test_invalid_backend_import(self):
self.assertRaises(InvalidSearchBackendError, get_search_backend, backend="I'm not a backend!")
def test_get_search_backends(self):
backends = list(get_search_backends())
self.assertEqual(len(backends), 1)
self.assertIsInstance(backends[0], DBSearch)
@override_settings(
WAGTAILSEARCH_BACKENDS={
'default': {
'BACKEND': 'wagtail.wagtailsearch.backends.db.DBSearch'
},
'another-backend': {
'BACKEND': 'wagtail.wagtailsearch.backends.db.DBSearch'
},
}
)
def test_get_search_backends_multiple(self):
backends = list(get_search_backends())
self.assertEqual(len(backends), 2)
def test_get_search_backends_with_auto_update(self):
backends = list(get_search_backends(with_auto_update=True))
# Auto update is the default
self.assertEqual(len(backends), 1)
@override_settings(
WAGTAILSEARCH_BACKENDS={
'default': {
'BACKEND': 'wagtail.wagtailsearch.backends.db.DBSearch',
'AUTO_UPDATE': False,
},
}
)
def test_get_search_backends_with_auto_update_disabled(self):
backends = list(get_search_backends(with_auto_update=True))
self.assertEqual(len(backends), 0)
@override_settings(
WAGTAILSEARCH_BACKENDS={
'default': {
'BACKEND': 'wagtail.wagtailsearch.backends.db.DBSearch',
'AUTO_UPDATE': False,
},
}
)
def test_get_search_backends_without_auto_update_disabled(self):
backends = list(get_search_backends())
self.assertEqual(len(backends), 1)