近期“知网”的热度一直不减,本来可以拿一些热点图片、网友评论作为开场。算了,这不是我一个技术博主该做的。
此处仅拿2022年5月24日早晨 6:00 微博搜索“知网”得到的前20条动态信息的词云说话。
基于 ik_smart 中文分词器的词云图
在网友不建议专家建议的大环境下,作为老百姓对“知网”的建议如下:
此处省略1万字......
当然,这些都不是我们平头老百姓该操心的事,作为技术人员,我更关注“知网”的本质——搜索。进一步说根据用户复杂的搜索条件,召回满意的结果。
问题来了,Elasticsearch 三大核心应用场景之一全文检索。用 Elasticsearch 能不能造一个“知网”呢?
这引发了我的极大的兴趣。
首先,为避免“井底之蛙”,需求降级,降低到自己可控的程度。
其次,“知网”支持的搜索非常复杂,我们只研究“一框”搜索。
把标题检索搞明白了,其他只是时间问题。
再次,“知网”是全网论文的集合体,我们聚焦本地磁盘文件的集合体。
文件类型包含但不限于:.txt, .pdf, .ppt, .doc,.docx 等文档。
综上,为避免落成“螳臂当车”的笑柄,我们把需求转化为简版的“知网”——本地知识库检索系统。
核心功能点如下:
原则:不重复造轮子,自己可控,使用已有的、成熟的、开源的技术栈体系。
2017 年我带领小伙伴做过类似的知识库检索系统,只不过当时的技术体系较旧,Elasticsearch 也是2.X 版本。
相关技术实现如下两图所示:
关于文档格式转换及解析器,又会涉及如下 N 多技术栈。
早期的技术实现大半时间都花费在了文档格式转换和解析处理上。有没有更好的实现方式,一直是我关心的问题。从最早的自己找各类解析工具用到了 openoffice 组件,到内容检测和分析框架 Tika,再到 Elasticsearch 自身支持的 Ingest Attachment 文档处理器插件,最终到 Elastic 工程师开源的文档爬虫工具——FSCrawler。
相比于闭源的金山WPS、微软Office,OpenOffice 现在已经成为全球领先的跨平台、全功能、多语言、公开对象接口、可扩展文件格式的开源办公软件 。引入相关 jar 包,即可实现文档的解析工作。
http://www.openoffice.org/
Apache Tika 用Java编写,用于文件类型检测和从各种格式的文件内容提取的库。
使用Tika可以开发出通用型检测器和内容提取到的不同类型的文件,如电子表格,文本文件,图像,PDF文件甚至多媒体输入格式,在一定程度上提取结构化文本以及元数据。
https://tika.apache.org/
基于 Tika 实现的 Elasticsearch 文件处理插件,支持:PPT、XLS、PDF、WORD 等格式。
需要单独安装实现,安装实现如下:
sudo bin/elasticsearch-plugin install ingest-attachment
https://www.elastic.co/guide/en/elasticsearch/plugins/current/ingest-attachment.html
2019-02-25 我在社群给小伙伴推荐过,当时我写了如下的两段话。
应用场景:文件系统检索、中文知识库构建、简化pdf、office等文档解析繁琐步骤,一键导入构建索引实现检索等操作。
使用效果(推荐理由):
https://github.com/dadoonet/fscrawler
https://t.zsxq.com/02EMR7MRn
诚然,仅从更贴合 Elasticsearch 实现的角度来讲,FSCrawler 是文档分析的“终结者”。它几乎包含了我上面所述两幅图的全部技术实现。
所以,我们选型 FSCrawler 作为文档数据源处理+写入 Elasticsearch 同步工具。
Flask 是目前最流行的 Python Web 框架之一。自 2010 年开源以来,Flask 受到了越来越多的 Python 开发者的喜欢,其受欢迎程度不输于 Django。
Flask 足够轻量,只用 5 行就能写出一个最简单的 Web 程序,但并不简陋,它能适应各类项目的开发。
截止:2022-05-24,GitHub Flask 框架 star 数:59.1k。
下图代表 Google 搜索走势,黄色:springboot,蓝色:django,蓝色:flask。flask 和 django 走势基本一致,受欢迎程度较高。
基于此,Web 部分我们选型 Python Flask 框架。
基于前面的需求分析和技术选型,整体架构&数据流图如下图所示。
相当于之前的分类型文档解析自己独立实现,FSCrawler 可谓“大包大揽”、“以一敌十”,之前最复杂、最困难的工作全部交由 FSCrawler 完成,包含但不限于:
有了上面的图,整体就会非常释然,就剩下四个字“干就完了”。
直接来个 Gif 动图,看一下实现效果。
相比于之前 java 开发的 web 系统,这次是我全栈实现,涉及到技术包含但不限于:Html、CSS、Javascript、Python、Flask、Elasticsearch、Kibana、FSCrawler。
由于足够轻量级,累计核心代码不到 1000 行。
取名为:织网知识库检索系统。此“织网”非彼“知网”。“织”强调的“精耕细作、日积月累、功不唐捐、水滴石穿”。
首页
列表页
详情页
各位基础稳定数据统计如下:
本系统涉及的文档数比较少,但要对 Elastic 充满信心。Elasticsearch 支持动态扩展,支持成千上万、数亿、数十亿只是配置问题和数据量问题,技术层面没有问题。
回归文章初心,“知网”是个非常庞大的功能体,仅就检索细节讨论的话,涉及很大一块的内容就是内容分析(分词处理、命名实体识别等 NLP 自然语言处理领域的知识)、以及文档之间的关联性(引用、被引用)等,是不小的工程。
本文是以“知网”的文档检索出发,构建了本地知识库系统,验证了 Elasticsearch 技术栈结合 Python Flask 构建知识库检索系统的可行性。
当然,一个系统的构建还会涉及很多其他细节内容,篇幅有限。我们找个时间给大家视频分享一下,一起探讨一下 Elasticsearch 在知识库检索系统中的应用。
参考
李辉《Flask Web 开发实战》
https://blog.csdn.net/laoyang360/article/details/75933314
https://medium.com/analytics-vidhya/building-a-basic-search-engine-using-elasticsearch-fscrawler-97104c1ea220
本文分享自 铭毅天下Elasticsearch 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!