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

wagtail-textract的Python项目详细描述


Build StatusCoverage Report

wagtail文档搜索的文本提取

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

textract可以从(在others)pdf、excel和word文件中提取文本。

这个包的灵感来自wagtail中的"Search: Extract text from documents" issue

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

一些截图来说明。

在我们新安装了wagtail_textract的Wagtail站点中, 我们上传了一个file called ^{},里面有手写文本。 它列在“文档”下的“管理”界面中:

Document List

如果我们现在在文档中搜索单词correct,这是一个手写单词, 实时搜索会找到它:

Document Search finds PDF by searching for "staple"

假设这个搜索不应该只在wagtail的管理界面中可用, 同时在面向公众的搜索视图中,我们提供了一个代码示例。

要求

成熟度

我们从2018年8月起在https://nuffic.nl生产中使用这个包。

安装

  • 安装Textract dependencies
  • wagtail_textract添加到您的需求和/或pip install wagtail_textract
  • 添加到您的djangoINSTALLED_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
  • 丹·布拉吉斯
  • 丹·斯温

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将多个线程中的函数放入单个队列   数组在Java中,如何在不改变整数顺序的情况下找到整数组的顺序?   java控制器属于表示层?   java Apache Ivy和本地Maven repo如何处理使用Maven 3构建的快照   Java可与泛型类型进行比较   java这个表达式在泛型中是什么意思   JavaEclipse和TeamCity插件   java检测构造函数中的final是否为空   java如何在StanfordCoreNLP管道中同时使用词汇化和依赖性解析器?   java在AntUnit控制台日志中显示完整异常堆栈跟踪   lambda如何与Java 8供应商建立连锁关系   如何让GRPC的重试机制在Kubernetes集群中使用grpcjava工作?   如何使用openjdk:7 Docker映像和Gradle包装器避免“EC参数错误”?   java将集合映射扩展为一维映射新的“无法推断函数接口类型”