1、题记

这是stackoverflow上一篇精彩的问答。

原文不大好理解,我做了梳理+图解;

原文是ES早期版本,部分写法已不适用,所有DSL我在6.X上进行了重写和验证;

针对原文内容做了扩展。

2、知识库全文检索问题抛出

重新审视一个停滞不前的项目,并寻求建议,对数千个“旧”文档进行现代化改造,

最终期望效果:通过网络访问这些文档。
文档以各种格式存在,有些已经过时:
- .doc,
- PageMaker,
- 硬拷贝hardcopy (OCR),
- PDF

- ……

很多文档已经被转化成扫描版的PDF,之前我们认为PDF类型是最终的文档格式,现在看来,我们想听听建议(比如:xml是不是更好呢?)

核心需求点:

1、一旦所有文档都采用通用格式,我们希望通过网页界面提供其内容并提供搜索服务。

2、我们希望通过搜索,能够灵活地只返回整个文档的部分页面(我相信的Lucene / elasticsearch使这成为可能?!?)

3、如果所有文档是XML是否会更加灵活?

4、如何存储、在哪里存储XML?是直接存储在数据库中还是存储成文件系统中的文件?关于文档中的嵌入式图像/图表呢?

以上,希望得到回复。

注解:xml只是提问者的当时初步的理解。

3、精彩回复

我将推荐ElasticSearch,我们先解决这个问题并讨论如何实现它:

这有几个部分:

  • 从文档中提取文本以使它们可以索引(indexable),以备检索;
  • 以全文搜索形式提供此文本;
  • 高亮显示文档片段;
  • 知道文档中的哪些段落可用于分页;
  • 返回完整的文档。

ElasticSearch可以提供什么:

  • ElasticSearch(如Solr)使用Tika从各种文档格式中提取文本和元数据;
  • Elasticsearch提供了强大的全文搜索功能。它可以配置为以适当的语言分析每个文档,它可以借助boost提高某些字段的权重(例如,标题比内容更重要),ngrams分词等标准Lucene操作;
  • Elasticsearch可以高亮显示搜索结果;
  • Elasticsearch不知道这些片段在您的文档中出现的位置;
  • Elasticsearch可以将原始文档存储为附件,也可以存储并返回提取的文本。但它会返回整个文档,而不是一个页面。

【直译】您可以将整个文档作为附件发送到ElasticSearch,并且可以进行全文搜索。但是关键点在于上面的(4)和(5):知道你文档中的位置,并返回文档的某些部分。存储单个页面可能足以满足您的“我在哪里”的目的,但是您希望将它们分组,以便在搜索结果中返回文档,即使搜索关键字出现在不同的页面上。

任务分解:

3.1、索引部分——将文档存储在ElasticSearch中。

使用Tika(或任何你喜欢的)来从每个文档中提取文本。将其保留为纯文本或HTML格式以保留一些格式。
(忘记XML,不需要它)。

每个文档提取元数据:标题,作者,章节,语言,日期等。

将原始文档存储在您的文件系统中,并记录路径,以便以后可以使用。

在ElasticSearch中,索引包含所有元数据和可能的章节列表的“doc”文档。

将每个页面索引为“page”文档,其中包含:
- 包含“doc”文档ID的父字段(请参阅下面的“父子关系”)
- 文本
- 页码
- 也许章节标题或编号
- 您想要搜索的任何元数据

存储必备——父子文档关系

通常,在ES(和大多数NoSQL解决方案)中,每个文档/对象都是独立的 - 没有真正的关系。

通过建立“doc”和“page”之间的父子关系,ElasticSearch确保子文档(即“页面”)与父文档(“doc”)存储在同一分片上。

这使您能够运行has_child等的查询方式,它将根据“page”的内容找到最匹配的“doc”。

图解示例:

二、检索部分——
现在进行搜索。

你如何做到这一点取决于你想如何展示你的结果

  • 按页面page分组,
  • 按文档doc分组。

通过页面的结果很容易。

此查询返回匹配页面的列表(每个页面全部返回)以及页面中高亮显示的片段列表。

举例如下:

POST /my_index/page/_search?pretty=1
{"query" : {"match" : {"text" : "interesting keywords"}},"highlight": {"pre_tags": ["<span style=\"color:red\">"],"post_tags": ["</span>"],"require_field_match": true,"fields": {"title": {}}}}

显示包含文本高亮字段的“doc”分组有点棘手。 它不能用一个单一的查询来完成。

一种方法可能是:

第1步:通过对其子(“页面”)查询,返回最匹配的父级(“doc”)。

POST /my_index/doc/_search?pretty=1
{"query": {"has_child": {"type": "page","query": {"bool": {"must": [{"match": {"text": "interesting keywords"}},{"term": {"type": "page"}},{"term": {"factor": "5"}}]}},"score_mode": "sum"}}
}

第2步:从上述查询中收集“doc”ID 发出新查询,从匹配的“页面”文档中获取片段。

GET /my_index/page/_search?pretty=1
{"query" : {"bool" : {"must":{"query" : {"match" : {"text" : "interesting keywords"}}},"filter" : {"terms" : {"doc_id" : [1,2,3]}}}},"highlight" : {"fields" : {"text" : {}}}
}

第3步:在您的应用程序中,将上述查询的结果按doc分组并显示出来。

使用第二个查询的搜索结果,您已经拥有了可供显示的页面的全文。要转到下一页,您可以搜索它:

GET /my_index/page/_search?pretty=1
{"query" : {"constant_score" : {"filter" : [{"term" : {"doc_id" : 1}},{"term" : {"page" : 2}}]}},"size" : 1
}

或者,给“页面”文档提供一个由doc_id _doc_id _ doc_id _ page_num(例如123_2)组成的ID,然后您可以通过如下的检索获取该页面:

curl -XGET'http://127.0.0.1:9200/my_index/page/123_2

3、扩展

Tika是一个内容分析工具,自带全面的parser工具类,能解析基本所有常见格式的文件,得到文件的metadata,content等内容,返回格式化信息。总的来说可以作为一个通用的解析工具。特别对于搜索引擎的数据抓去和处理步骤有重要意义。

Tika是Apache的Lucene项目下面的子项目,在lucene的应用中可以使用tika获取大批量文档中的内容来建立索引,非常方便,也很容易使用。

Apache Tika toolkit可以自动检测各种文档(如word,ppt,xml,csv,ppt等)的类型并抽取文档的元数据和文本内容。

Tika集成了现有的文档解析库,并提供统一的接口,使针对不同类型的文档进行解析变得更简单。Tika针对搜索引擎索引、内容分析、转化等非常有用。

4、有没有现成的开源实现呢?

https://github.com/RD17/ambar

Ambar是一个开源文搜索引擎,具有自动抓取,OCR识别,标签分类和即时全文搜索功能。

Ambar定义了在工作流程中实现全文本文档搜索的新方法:

  • 轻松部署Ambar和一个单一的docker-compose文件
  • 通过文档和图像内容执行类似Google的搜索
  • Ambar支持所有流行的文档格式,如果需要的话可以执行OCR
  • 标记您的文件
  • 使用简单的REST
  • Api将Ambar集成到您的工作流程中

参考:

  • http://t.cn/R1gTMw4
  • http://t.cn/8FYfhE2
  • http://t.cn/R1gTK3M
  • http://t.cn/R1gT6GY
  • http://t.cn/RaPOswu

2018-06-07 22:43 思于家中床前

作者:铭毅天下
转载请标明出处,原文地址:
https://blog.csdn.net/laoyang360/article/details/80616320
如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

干货 | 知识库全文检索的最佳实践相关推荐

  1. 【转载】绝对干货!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载九)如何通过源代...

    2019独角兽企业重金招聘Python工程师标准>>> 除了使用Linux的包管理机制进行软件的安装.更新和卸载,从源代码进行软件的安装也是非常常见的,开源软件提供了源代码包,开发者 ...

  2. 干货:基于 Git Flow 的 Git 最佳实践(附加解决大家经常碰到的问题)

    干货:基于 Git Flow 的 Git 最佳实践(附加解决大家经常碰到的问题) 参考文章: (1)干货:基于 Git Flow 的 Git 最佳实践(附加解决大家经常碰到的问题) (2)https: ...

  3. python 自动化微信小程序_干货 | 微信小程序自动化测试最佳实践(附 Python 源码)...

    原标题:干货 | 微信小程序自动化测试最佳实践(附 Python 源码) 本文为霍格沃兹测试学院测试大咖公开课<微信小程序自动化测试>图文整理精华版. 随着微信小程序的功能和生态日益完善, ...

  4. 全程干货!拍乐云受邀LiveVideoStackCon,首席科学家分享拥塞控制最佳实践

    2021年4月16日-4月17日,国内规模最大的多媒体技术领域峰会LiveVideoStackCon在上海隆重举行.本届大会以"新技术,新机会"为主题,聚焦在音频.视频.图像等技术 ...

  5. 干货 | 独创分布式网络负载均衡最佳实践

    干货 | 独创分布式网络负载均衡最佳实践 原创:   京东云IaaS产品部   京东云开发者社区    昨天 一.概述 在高可用场景中,后端服务器集群之前通常会部署负载均衡器,负载均衡器作为访问流量的 ...

  6. 微信 小程序 python 渲染_干货 | 微信小程序自动化测试最佳实践(附 Python 源码)...

    本文为霍格沃兹测试学院测试大咖公开课<微信小程序自动化测试>图文整理精华版,进阶学习文末加群! 随着微信小程序的功能和生态日益完善,很多公司的产品业务形态逐渐从 App 延升到微信小程序. ...

  7. 干货 | 京东云部署Wordpress最佳实践

    摘要 传统的IT环境构建是比较复杂的过程.从安装硬件.配置网络.安装软件.应用.配置存储等,许多环节都需要一定的技术力量储备.当环境发生改变时,整个过程需要重复进行.我们都知道,不同的人安装配置的环境 ...

  8. 移动 Web 最佳实践(干货长文,建议收藏)

    作者:mucking| 来源:掘金 https://juejin.im/post/5d759f706fb9a06afa32adec 笔者在公司用 web 技术开发移动端应用已经有一年多的时间了,开始主 ...

  9. 【干货】蚂蚁前端研发最佳实践

    作者:云谦,已获得作者授权转载 以下是云谦之前在成都全栈大会分享的文字稿,介绍了蚂蚁前端研发的最佳实践,其中提取了三个比较重要的点,每个点都是蚂蚁实践和深入思考后的结果,希望能对大家有所启发,欢迎探讨 ...

最新文章

  1. mysql update时数据不存在新增_mysql sql语句新增判断,存在修改,不存在新增
  2. H.264编码系统几个比较重要的算法
  3. larval mysql 查询转数组_laravel 中将DB::select 得到的内容转为数组
  4. 路由策略原理及配置请查收......
  5. python的类变量和成员变量用法_Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析...
  6. 数据库为什么不适合搜索引擎的底层存储?
  7. java授权失败_自定义Spring Security的身份验证失败处理方法
  8. android ListView常用知识总结
  9. Java 设计模式之 Abstract Factory 抽象工厂模式
  10. python无法导入模块_python怎么导入模块
  11. iOS之HealthKit使用
  12. 以太坊实战篇-创建并运行一个最简单的转账合约
  13. 2022 年最新博客专家申请流程
  14. MIP 问题解决方案大全(2018-06更新)
  15. 高通芯片联机读取修改串码 meid ESN wifi 蓝牙 sn等参数的操作解析{二}
  16. 2019 年 Q1 全球云基础设施市场份额揭晓,AWS继续领跑市场;Mesos官方回应Twitter“抛弃”Mesos……...
  17. 2017 LARS:LARGE BATCH TRAINING OF CONVOLUTIONAL NETWORKS (训练大Batch的卷积神经网络)
  18. Linux中计算特定CPU使用率
  19. Android背景和音乐
  20. Windows 服务器刷题(带答案)

热门文章

  1. [website] welcomePage 和 获取待时间轴歌词
  2. 京东店铺人群标签如何优化?
  3. linux kickstart之中rootpw密码生成方法
  4. 非接触式射频读卡器 M1读卡,支持USB,ISO14443A/B,可读二代证ID
  5. oracle导出到hive,从Oracle导出数据并导入到Hive
  6. TensorFlow实战:经典卷积神经网络(AlexNet、VGGNet)
  7. sscanf输出指定MAC地址格式
  8. ip和mac地址格式填报校验
  9. Unity3D学习笔记(四)天空、光晕和迷雾
  10. 【毕业设计】基于SSM的酒店客房信息管理系统 - java web