允许在Wagtail内容管理系统中的文档中搜索文本
项目描述
为Wagtail文档搜索提供文本提取
此包用于将Wagtail的文档类替换为一个允许使用textract在文档文件内容中进行搜索的类。
Textract可以从(包括其他)PDF、Excel和Word文件中提取文本。
此包受到了"搜索:从文档中提取文本"问题的启发。
文档将像以前一样工作,只是在Wagtail管理界面中的文档搜索也会在文件内容中找到搜索词。
以下是一些截图来说明。
在我们的新Wagtail站点中,已安装了wagtail_textract
,我们上传了一个包含手写文本的文件,文件名为test_document.pdf
,您可以通过此链接访问。该文件在管理界面“文档”下列出。
如果我们现在在“文档”中搜索手写单词之一correct
,实时搜索会找到它。
假设这个搜索不仅应该可在Wagtail的管理界面中使用,还应该在面向公众的搜索视图中使用,为此我们提供了一个代码示例。
要求
- Wagtail 2(参见tox.ini)
- Textract依赖项
成熟度
自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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1a2329590d4e5033db70e472ec4023dbf4afe8056087e9db9162b08077749893 |
|
MD5 | 9b028f1ca94af2fcb8dfa6af72cd0349 |
|
BLAKE2b-256 | dc08121863fd4f72df226fe7063a9ed8fcdc14ec46f08cc495cc61bd9d6f5f07 |