允许在wagtail内容管理系统中搜索文档中的文本
wagtail-textract的Python项目详细描述
wagtail文档搜索的文本提取
此包用于将Wagtail的文档类替换为 它允许使用textract在文档文件内容中进行搜索。
textract可以从(在others)pdf、excel和word文件中提取文本。
这个包的灵感来自wagtail中的"Search: Extract text from documents" issue。
文档将像以前一样工作,除了wagtail的管理界面中的文档搜索 也会在文件的内容中找到搜索词。
一些截图来说明。
在我们新安装了wagtail_textract
的Wagtail站点中,
我们上传了一个file called ^{
如果我们现在在文档中搜索单词correct
,这是一个手写单词,
实时搜索会找到它:
假设这个搜索不应该只在wagtail的管理界面中可用, 同时在面向公众的搜索视图中,我们提供了一个代码示例。
要求
成熟度
我们从2018年8月起在https://nuffic.nl生产中使用这个包。
安装
- 安装Textract dependencies
- 将
wagtail_textract
添加到您的需求和/或pip install wagtail_textract
- 添加到您的django
INSTALLED_APPS
。 - 将
WAGTAILDOCS_DOCUMENT_MODEL = "wagtail_textract.document"
放入django设置中。
注意:在安装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.
我们还没有看到这会导致问题,但要记住这一点。
镶嵌
为了使textract
使用Tesseract,如果规则
textract
找不到文本,需要添加tesseract可以添加的数据文件
根据它的单词匹配。
在项目目录中创建一个tessdata
目录,并下载
languages你想要。
转录
文档保存后自动完成转录,
在^{
./manage.py transcribe_documents
显然,这可能需要很长时间。
在自定义视图中使用
下面是搜索视图的代码示例(在wagtail的管理界面之外) 显示页面和文档结果的。
fromitertoolsimportchainfromwagtail.core.modelsimportPagefromwagtail.documents.modelsimportget_document_modeldefsearch(request):# Searchsearch_query=request.GET.get('query',None)ifsearch_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 resultsQuery.get(search_query).add_hit()else:search_results=Page.objects.none()# Render templatereturnrender(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's Document:
- 子类
TranscriptionMixin
- 改变
search_fields
fromwagtail_textract.modelsimportTranscriptionMixinclassCustomizedDocument(TranscriptionMixin,...):"""Extra fields and methods for Document model."""search_fields=...+[index.SearchField('transcription',partial_match=False,),]
注意,子类的第一个类应该是TranscriptionMixin
,
所以它的save()
优先于其他父类。
测试
要运行测试,请签出此存储库并:
make test
覆盖范围
将在./coverage_html_report/
中生成覆盖率报告。
贡献者
- 卡尔·霍布利
- 伯特兰·博尔达格
- Kees Hink
- 汤姆亨德里克斯
- 科恩·范德坎普
- Mike Overkamp
- thibaud colas
- 丹·布拉吉斯
- 丹·斯温