kopia lustrzana https://github.com/wagtail/wagtail
Merge branch 'kaedroho-searchchanges/updateindex-multi-backend'
commit
4d1cf64cb0
|
@ -14,6 +14,7 @@ Changelog
|
|||
* Project template updated to Django 1.7
|
||||
* 'boost' applied to the title field on searches reduced from 100 to 2
|
||||
* The 'type' method of PageQuerySet (used to filter the queryset to a specific page type) now includes subclasses of the given page type.
|
||||
* The 'update_index' management command now updates all backends listed in WAGTAILSEARCH_BACKENDS, or a specific one passed on the command line, rather than just the default backend
|
||||
* Fix: 'wagtail start' command now works on Windows
|
||||
* Fix: The external image URL generator no longer stores generated images in Django's cache
|
||||
* Fix: Elasticsearch backend can now search querysets that have been filtered with an 'in' clause of a non-list type (such as a ValuesListQuerySet)
|
||||
|
|
|
@ -47,7 +47,7 @@ Options:
|
|||
update_index
|
||||
------------
|
||||
|
||||
:code:`./manage.py update_index`
|
||||
:code:`./manage.py update_index [--backend <backend name>]`
|
||||
|
||||
This command rebuilds the search index from scratch. It is only required when using Elasticsearch.
|
||||
|
||||
|
@ -59,6 +59,24 @@ It is recommended to run this command once a week and at the following times:
|
|||
The search may not return any results while this command is running, so avoid running it at peak times.
|
||||
|
||||
|
||||
Specifying which backend to update
|
||||
``````````````````````````````````
|
||||
|
||||
.. versionadded:: 0.7
|
||||
|
||||
|
||||
By default, ``update_index`` will rebuild all the search indexes listed in ``WAGTAILSEARCH_BACKENDS``.
|
||||
|
||||
If you have multiple backends and would only like to update one of them, you can use the ``--backend`` option.
|
||||
|
||||
For example, to update just the default backend:
|
||||
|
||||
.. code-block::
|
||||
|
||||
python manage.py update_index --backend default
|
||||
|
||||
|
||||
|
||||
.. _search_garbage_collect:
|
||||
|
||||
search_garbage_collect
|
||||
|
|
|
@ -32,6 +32,7 @@ Minor features
|
|||
* The project template (used when running ``wagtail start``) has been updated to Django 1.7.
|
||||
* The 'boost' applied to the title field on searches has been reduced from 100 to 2.
|
||||
* The ``type`` method of ``PageQuerySet`` (used to filter the queryset to a specific page type) now includes subclasses of the given page type.
|
||||
* The ``update_index`` management command now updates all backends listed in ``WAGTAILSEARCH_BACKENDS``, or a specific one passed on the command line, rather than just the default backend.
|
||||
|
||||
Bug fixes
|
||||
~~~~~~~~~
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
from optparse import make_option
|
||||
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.db import models
|
||||
from django.conf import settings
|
||||
|
||||
from wagtail.wagtailsearch.indexed import Indexed
|
||||
from wagtail.wagtailsearch.backends import get_search_backend
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
def handle(self, **options):
|
||||
def get_object_list(self):
|
||||
# Print info
|
||||
self.stdout.write("Getting object list")
|
||||
|
||||
|
@ -41,26 +44,57 @@ class Command(BaseCommand):
|
|||
# Space free, take it
|
||||
object_set[key] = obj
|
||||
|
||||
# Search backend
|
||||
if 'backend' in options:
|
||||
s = options['backend']
|
||||
else:
|
||||
s = get_search_backend()
|
||||
return indexed_models, object_set.values()
|
||||
|
||||
def update_backend(self, backend_name, models, object_list):
|
||||
# Print info
|
||||
self.stdout.write("Updating backend: " + backend_name)
|
||||
|
||||
# Get backend
|
||||
backend = get_search_backend(backend_name)
|
||||
|
||||
# Reset the index
|
||||
self.stdout.write("Reseting index")
|
||||
s.reset_index()
|
||||
self.stdout.write(backend_name + ": Reseting index")
|
||||
backend.reset_index()
|
||||
|
||||
# Add types
|
||||
self.stdout.write("Adding types")
|
||||
for model in indexed_models:
|
||||
s.add_type(model)
|
||||
self.stdout.write(backend_name + ": Adding types")
|
||||
for model in models:
|
||||
backend.add_type(model)
|
||||
|
||||
# Add objects to index
|
||||
self.stdout.write("Adding objects")
|
||||
for result in s.add_bulk(object_set.values()):
|
||||
self.stdout.write(backend_name + ": Adding objects")
|
||||
for result in backend.add_bulk(object_list):
|
||||
self.stdout.write(result[0] + ' ' + str(result[1]))
|
||||
|
||||
# Refresh index
|
||||
self.stdout.write("Refreshing index")
|
||||
s.refresh_index()
|
||||
self.stdout.write(backend_name + ": Refreshing index")
|
||||
backend.refresh_index()
|
||||
|
||||
option_list = BaseCommand.option_list + (
|
||||
make_option('--backend',
|
||||
action='store',
|
||||
dest='backend_name',
|
||||
default=None,
|
||||
help="Specify a backend to update",
|
||||
),
|
||||
)
|
||||
|
||||
def handle(self, **options):
|
||||
# Get object list
|
||||
models, object_list = self.get_object_list()
|
||||
|
||||
# Get list of backends to index
|
||||
if options['backend_name']:
|
||||
# index only the passed backend
|
||||
backend_names = [options['backend_name']]
|
||||
elif hasattr(settings, 'WAGTAILSEARCH_BACKENDS'):
|
||||
# index all backends listed in settings
|
||||
backend_names = settings.WAGTAILSEARCH_BACKENDS.keys()
|
||||
else:
|
||||
# index the 'default' backend only
|
||||
backend_names = ['default']
|
||||
|
||||
# Update backends
|
||||
for backend_name in backend_names:
|
||||
self.update_backend(backend_name, models, object_list)
|
||||
|
|
|
@ -20,6 +20,7 @@ class BackendTests(WagtailTestUtils):
|
|||
for backend_name, backend_conf in settings.WAGTAILSEARCH_BACKENDS.items():
|
||||
if backend_conf['BACKEND'] == self.backend_path:
|
||||
self.backend = get_search_backend(backend_name)
|
||||
self.backend_name = backend_name
|
||||
break
|
||||
else:
|
||||
# no conf entry found - skip tests for this backend
|
||||
|
@ -153,7 +154,7 @@ class BackendTests(WagtailTestUtils):
|
|||
|
||||
# Run update_index command
|
||||
with self.ignore_deprecation_warnings(): # ignore any DeprecationWarnings thrown by models with old-style indexed_fields definitions
|
||||
management.call_command('update_index', backend=self.backend, interactive=False, stdout=StringIO())
|
||||
management.call_command('update_index', backend_name=self.backend_name, interactive=False, stdout=StringIO())
|
||||
|
||||
# Check that there are still 3 results
|
||||
results = self.backend.search("Hello", models.SearchTest)
|
||||
|
|
Ładowanie…
Reference in New Issue