使用TikaOnDotNet逐页提取文本存入Elasticsearch的方案咨询
Elasticsearch 按页存储检索实现思路
1. 文本提取环节补充页码绑定
你当前已经在用TikaOnDotNet做文本提取,只要调整解析配置即可拿到分页关联的内容,不需要额外更换组件:
- 针对PDF格式:开启Tika的页级别解析监听事件,每解析完成一页就单独返回当前页文本+对应页码,不要将整份文档的文本拼接为完整字符串
- 针对MS Office格式:Word的自动/手动分页符、PPT的单页天然边界都可被Tika识别,同样可以通过事件监听拿到单页内容与对应页码,常规文档的分页识别准确率可达90%以上
- 针对.eml等无天然分页的格式:可自定义虚拟分页规则,比如按固定字符数、固定段落数拆分,拆分后的单元标注虚拟页码即可,检索时可额外说明是虚拟分页位置
每个分页单元整理为结构化数据示例:
{ "doc_id": "全文档唯一标识", "doc_name": "文档完整名称", "page_num": 2, "page_content": "当前页的纯文本内容", "doc_meta": "其他需要存储的文档元数据,比如上传时间、作者、文件类型等" }
2. Elasticsearch 索引设计
索引mapping按需配置即可,核心字段参考:
doc_id设置为keyword类型,用于聚合同一份文档的所有分页数据page_num设置为integer类型,用于排序、筛选以及最终返回页码结果page_content设置为text类型,根据业务需要配置对应分词器(中文场景推荐配置IK分词器),用于全文检索- 全文档公用的元数据如果字段不多,可以直接冗余存储在每一条分页文档中,查询时不需要二次关联,效率更高;如果元数据字段复杂,也可以单独做一个主文档索引,查询时通过
doc_id关联即可
3. 检索逻辑实现
用户输入关键词检索时,直接针对page_content字段做全文查询:
- 如果你需要返回单份文档中所有出现关键词的页码,在查询时增加按
doc_id的terms聚合,在聚合结果中对page_num去重,即可一次性拿到一份文档中关键词命中的所有页码 - 如需提升用户体验,可以开启ES的
highlight高亮配置,返回匹配到的关键词上下文片段,前端同步展示页码+高亮内容,用户可以直接看到对应页的匹配内容
4. 边缘场景兜底
- 遇到加密、损坏无法解析分页的文档,提前做异常捕获,可标记为无分页文档,或者返回默认提示
- 页数较多的长文档入库时,建议用ES批量提交接口,避免单次请求压力过大导致入库失败
内容的提问来源于stack exchange,提问作者Hi Ten
相关产品推荐
相关产品推荐

