1、题记这是stackoverflow上一篇精彩的问答。
2、知识库全文检索问题抛出重新审视一个停滞不前的项目,并寻求建议,对数千个“旧”文档进行现代化改造, 最终期望效果:通过网络访问这些文档。
很多文档已经被转化成扫描版的PDF,之前我们认为PDF类型是最终的文档格式,现在看来,我们想听听建议(比如:xml是不是更好呢?) 核心需求点: 1、一旦所有文档都采用通用格式,我们希望通过网页界面提供其内容并提供搜索服务。 2、我们希望通过搜索,能够灵活地只返回整个文档的部分页面(我相信的Lucene / elasticsearch使这成为可能?!?) 3、如果所有文档是XML是否会更加灵活? 4、如何存储、在哪里存储XML?是直接存储在数据库中还是存储成文件系统中的文件?关于文档中的嵌入式图像/图表呢? 以上,希望得到回复。 注解:xml只是提问者的当时初步的理解。 3、精彩回复我将推荐ElasticSearch,我们先解决这个问题并讨论如何实现它: 这有几个部分:
ElasticSearch可以提供什么:
【直译】您可以将整个文档作为附件发送到ElasticSearch,并且可以进行全文搜索。但是关键点在于上面的(4)和(5):知道你文档中的位置,并返回文档的某些部分。 存储单个页面可能足以满足您的“我在哪里”的目的,但是您希望将它们分组,以便在搜索结果中返回文档,即使搜索关键字出现在不同的页面上。 任务分解: 3.1、索引部分——将文档存储在ElasticSearch中。 使用Tika(或任何你喜欢的)来从每个文档中提取文本。将其保留为纯文本或HTML格式以保留一些格式。 每个文档提取元数据:标题,作者,章节,语言,日期等。 将原始文档存储在您的文件系统中,并记录路径,以便以后可以使用。 在ElasticSearch中,索引包含所有元数据和可能的章节列表的“doc”文档。 将每个页面索引为“page”文档,其中包含:
存储必备——父子文档关系:
父子文档存储图解如下所示: 3.2、检索部分 你如何做到这一点取决于你想如何展示你的结果
通过页面的结果很容易。 此查询返回匹配页面的列表(每个页面全部返回)以及页面中高亮显示的片段列表。 举例如下: 1POST /my_index/page/_search?pretty=1 显示包含文本高亮字段的“doc”分组有点棘手。 它不能用一个单一的查询来完成。 一种方法可能是: 第1步:通过对其子(“页面”)查询,返回最匹配的父级(“doc”)。 1POST /my_index/doc/_search?pretty=1 第2步:从上述查询中收集“doc”ID 发出新查询,从匹配的“页面”文档中获取片段。 1GET /my_index/page/_search?pretty=1 第3步:在您的应用程序中,将上述查询的结果按doc分组并显示出来。 使用第二个查询的搜索结果,您已经拥有了可供显示的页面的全文。要转到下一页,您可以搜索它: 1GET /my_index/page/_search?pretty=1 或者,给“页面”文档提供一个由$ doc_id _ $ page_num(例如123_2)组成的ID,然后您可以通过如下的检索获取该页面: 1curl -XGET'http://127.0.0.1:9200/my_index/page/123_2 4、扩展Tika是一个内容分析工具,自带全面的parser工具类,能解析基本所有常见格式的文件,得到文件的metadata,content等内容,返回格式化信息。总的来说可以作为一个通用的解析工具。特别对于搜索引擎的数据抓去和处理步骤有重要意义。 Tika是Apache的Lucene项目下面的子项目,在lucene的应用中可以使用tika获取大批量文档中的内容来建立索引,非常方便,也很容易使用。 Apache Tika toolkit可以自动检测各种文档(如word,ppt,xml,csv,ppt等)的类型并抽取文档的元数据和文本内容。 Tika集成了现有的文档解析库,并提供统一的接口,使针对不同类型的文档进行解析变得更简单。Tika针对搜索引擎索引、内容分析、转化等非常有用。 5、有没有现成的开源实现呢?https://github.com/RD17/ambar Ambar是一个开源文搜索引擎,具有自动抓取,OCR识别,标签分类和即时全文搜索功能。 Ambar定义了在工作流程中实现全文本文档搜索的新方法:
参考:
知识库更多参考:实战 | Elasticsearch打造知识库检索系统 加入知识星球,更短时间更快习得更多干货! |
|