关于搜索后端

Wagtail有着对多种后端的支持,从而提供了使用数据库的搜索,或使用诸如Elasticsearch这样的外部服务进行搜索的选择。默认启用的是数据库后端。

可使用WAGTAILSEARCH_BACKENDS设置,来配置要使用的后端:

  1. WAGTAILSEARCH_BACKENDS = {
  2. 'default': {
  3. 'BACKEND': 'wagtail.search.backends.db',
  4. }
  5. }

AUTO_UPDATE

默认Wagtail将自动保持所有索引处于更新状态。此默认行为在编辑内容时,将对性能造成影响,尤其是在索引驻留在外部服务上时。

AUTO_UPDATE设置,允许在单个索引基础上,关闭默认行为:

  1. WAGTAILSEARCH_BACKENDS = {
  2. 'default': {
  3. 'BACKEND': ...,
  4. 'AUTO_UPDATE': False,
  5. }
  6. }

如关闭了自动更新,那么就必须定期运行update_index命令,以保持索引与数据库同步。

ATOMIC_REBUILD

警告 此选项在Elasticsearch 5.4及更高版本上不会工作,是因为别名处理中的一个bug 影响到这些版本。

默认(使用Elasticsearch后端时)在update_index运行时,Wagtail会删除索引并从头开始重建出来。这就会导致在重建完成之前搜索引擎不会返回结果,同时这也有着发生了错误时无法回滚的风险。

ATOMIC_REBUILD设置项目,设置为True,就会令到Wagtail重建为一个独立的索引,而在新的索引完全建立之前,保持原有的索引处于活动状态。在重建完成之后,新旧索引进行原子交换,且旧的索引被删除。

BACKEND

下面是Wagtail原生支持的后端清单。

数据库后端(默认支持

wagtail.search.backends.db

数据库后端是甚为基础的,而仅是打算供开发与小型站点所用。其无法依相关度对结果进行排序,从而严重妨碍了其在对大量页面集进行搜索时的可用性。

数据库后端不具备对以下特性的支持:

在上述任何一个特性都是重要的情况下,就要使用Elasticsearch了。

PostgreSQL 的后端

wagtail.contrib.postgres_search.backend

在使用PostgreSQL作为数据库,且站点页面数少于一百万时,就可能打算使用此后端了。

请参阅PostgreSQL的搜索引擎以了解更多知识。

Elasticsearch 后端

Wagtail 2.1 的改动: 加入了对 Elasticsearch 6.x 的支持

Wagtail支持 Elasticsearch 的版本2、5与6。请使用对应版本的后端:

wagtail.search.backends.elasticsearch2 (Elasticsearch 2.x)

wagtail.search.backends.elasticsearch5 (Elasticsearch 5.x)

wagtail.search.backends.elasticsearch6 (Elasticsearch 6.x)

使用此后端的前提,是先要有Elasticsearch服务本身,以及通过pip安装上elasticsearch-py这个包。该包的大版本号要与所安装的Elasticsearch的版本匹配:

  1. $ pip install "elasticsearch>=2.0.0,<3.0.0" # 对于Elasticsearch 2.x
  2. $ pip install "elasticsearch>=5.0.0,<6.0.0" # 对于Elasticsearch 5.x
  3. $ pip install "elasticsearch>=6.0.0,<6.3.1" # 对于Elasticsearch 6.x

注意 版本 6.3.1 的 Elasticsearch客户端库与Wagtail不兼容。请使用 6.3.0或更早版本。

后端实在设置中配置的:

  1. WAGTAILSEARCH_BACKENDS = {
  2. 'default': {
  3. 'BACKEND': 'wagtail.search.backends.elasticsearch2',
  4. 'URLS': ['http://localhost:9200'],
  5. 'INDEX': 'wagtail',
  6. 'TIMEOUT': 5,
  7. 'OPTIONS': {},
  8. 'INDEX_SETTINGS': {},
  9. }
  10. }

BACKEND不同,其他键是可选的,且默认为上面的那些值。在OPTIONS中定义的所有键,都被直接作为区分大小写的关键字参数(比如'max_retries': 1),传递给 Elasticsearch的构造器。

INDEX_SETTINGS则是一个用于对默认创建索引方式设置进行覆写的字典。该创建索引方式设置项,定义在模块wagtail/wagtail/wagtailsearch/backends/elasticsearch.py模块里ElasticsearchSearchBacken类的内容。将加入所有的新键,对于既有键,如其不是一个字典,那么都将以新的值进行替换。下面是一个如何配置分片数,以及将意大利语的语言分析器作为默认分析器的示例:

  1. WAGTAILSEARCH_BACKENDS = {
  2. 'default': {
  3. ...,
  4. 'INDEX_SETTINGS': {
  5. 'settings': {
  6. 'index': {
  7. 'number_of_shards': 1,
  8. },
  9. 'analysis': {
  10. 'analyzer': {
  11. 'default': {
  12. 'type': 'italian'
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }

若不在开发或生产环境选择运行一个Elasticsearch服务器,那么有着多个可用的第三方主机服务,包括Bonsai,该站点提供了一个适合与测试与开发的免费帐号。要使用Bonsai:

  • 在Bonsai注册一个帐号
  • 使用Bonsai的仪表盘创建一个集群
  • 使用Bonsai仪表盘中的该集群URL,配置WAGTAILSEARCH_BACKENDS中的URLS条目
  • 运行./manage.py update_index命令

Amazon AWS 的Elasticsearch

Wagtail的Elasticsearch后端,是与Amazon 的Elasticsearch服务兼容的,但需要额外配置,以处理基于IMA的认证。这可通过requests-aws4auth pip 包,与以下的配置来完成:

  1. from elasticsearch import RequestsHttpConnection
  2. from requests_aws4auth import AWS4AUTH
  3. WAGTAILSEARCH_BACKENDS = {
  4. 'default': {
  5. 'BACKEND': 'wagtail.search.backends.elasticsearch2',
  6. 'INDEX': 'wagtail',
  7. 'TIMEOUT': 5,
  8. 'HOSTS': [{
  9. 'host': 'YOURCLUSTER.REGION.es.amazonaws.com',
  10. 'port': 443,
  11. 'use_ssl': True,
  12. 'verify_certs': True,
  13. 'http_auth': AWS4AUTH('ACCESS_KEY', 'SECRET_KEY', 'REGION', 'es'),
  14. }],
  15. 'OPTIONS': {
  16. 'connection_class': RequestsHttpConnection,
  17. }
  18. }
  19. }

构造自己的后端

Rolling Your Own

Wagtail搜索后端实现了在wagtail/wagtail/wagtailsearch/backends/base.py中的接口。在最低限度下,后端的search()方法必须返回一个对象集合或model.objects.none()。而对于一个具有完整特性的搜索后端,请在elasticsearch.py中查看Elasticsearch的后端代码。