跳转到主要内容

允许在Wagtail内容管理系统中的文档中搜索文本

项目描述

Build Status Coverage Report

为Wagtail文档搜索提供文本提取

此包用于将Wagtail的文档类替换为一个允许使用textract在文档文件内容中进行搜索的类。

Textract可以从(包括其他)PDF、Excel和Word文件中提取文本。

此包受到了"搜索:从文档中提取文本"问题的启发。

文档将像以前一样工作,只是在Wagtail管理界面中的文档搜索也会在文件内容中找到搜索词。

以下是一些截图来说明。

在我们的新Wagtail站点中,已安装了wagtail_textract,我们上传了一个包含手写文本的文件,文件名为test_document.pdf,您可以通过此链接访问。该文件在管理界面“文档”下列出。

Document List

如果我们现在在“文档”中搜索手写单词之一correct,实时搜索会找到它。

Document Search finds PDF by searching for "staple"

假设这个搜索不仅应该可在Wagtail的管理界面中使用,还应该在面向公众的搜索视图中使用,为此我们提供了一个代码示例。

要求

成熟度

自2018年8月起,我们已在https://nuffic.nl上使用此包进行生产。

安装

  • 安装Textract依赖项
  • wagtail_textract添加到您的需求文件中,或使用pip install wagtail_textract
  • 将其添加到您的Django INSTALLED_APPS
  • 在您的Django设置中添加WAGTAILDOCS_DOCUMENT_MODEL = "wagtail_textract.document"

注意:在安装wagtail_textract时(安装了Wagtail 2.0.1),您将收到一个不兼容警告。

requests 2.18.4 has requirement chardet<3.1.0,>=3.0.2, but you'll have chardet 2.3.0 which is incompatible.
textract 1.6.1 has requirement beautifulsoup4==4.5.3, but you'll have beautifulsoup4 4.6.0 which is incompatible.

我们尚未看到这导致问题,但这是一个需要注意的事项。

Tesseract

为了使textract使用Tesseract,如果在常规textract中找不到文本,您需要添加Tesseract可以基于其单词匹配的数据文件。

在您的项目目录中创建一个tessdata目录,并下载您想要的语言

转录

在文档保存后自动进行转录,在asyncio执行器中进行,以防止在处理过程中阻塞响应。

要转录所有现有的文档,请运行管理命令:

./manage.py transcribe_documents

这显然可能需要很长时间。

在自定义视图中使用

以下是一个搜索视图的代码示例(在Wagtail管理界面之外),该示例显示了页面和文档的结果。

from itertools import chain

from wagtail.core.models import Page
from wagtail.documents.models import get_document_model


def search(request):
    # Search
    search_query = request.GET.get('query', None)
    if search_query:
        page_results = Page.objects.live().search(search_query)
        document_results = Document.objects.search(search_query)
        search_results = list(chain(page_results, document_results))

        # Log the query so Wagtail can suggest promoted results
        Query.get(search_query).add_hit()
    else:
        search_results = Page.objects.none()

    # Render template
    return render(request, 'website/search_results.html', {
        'search_query': search_query,
        'search_results': search_results,
    })

您的模板应允许以不同于页面的方式处理文档,因为在文档上不能执行pageurl result

{% if result.file %}
   <a href="{{ result.url }}">{{ result }}</a>
{% else %}
   <a href="{% pageurl result %}">{{ result }}</a>
{% endif %}

如果您已经使用了一个自定义文档模型呢?

为了使用wagtail_textract,您的CustomizedDocument模型应该与wagtail_textract的Document相同。

  • 子类TranscriptionMixin
  • 修改search_fields
from wagtail_textract.models import TranscriptionMixin


class CustomizedDocument(TranscriptionMixin, ...):
    """Extra fields and methods for Document model."""
    search_fields = ... + [
        index.SearchField(
            'transcription',
            partial_match=False,
        ),
    ]

请注意,首先子类的类应该是TranscriptionMixin,因此它的save()优先于其他父类。

测试

要运行测试,请检出此存储库并

make test

覆盖率

覆盖率报告将在./coverage_html_report/中生成。

贡献者

  • Karl Hobley
  • Bertrand Bordage
  • Kees Hink
  • Tom Hendrikx
  • Coen van der Kamp
  • Mike Overkamp
  • Thibaud Colas
  • Dan Braghis
  • Dan Swain

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

wagtail-textract-1.2.tar.gz (1.0 MB 查看哈希值)

上传于

支持者