当前位置: 首页 > news >正文

从零开始:如何用 C# 开发一款媲美 “AnyTxt” 的文件内容搜索工具

起文件内容搜索工具,那么不得不提到“AnyTxt”,号称本地知识库检索的终极答案。唯一的不足可能就是索引更新机制,不能实时监视文件更改从而更新索引,最小定期更新间隔为半小时,容易导致cpu占用率高,毕竟是全盘全文件类型索引。

很多时候,其实我们对文件内容的搜索,是一个简单文档管理需求,我们期望能的是快速定位文件,而不仅仅是信息。这时候对文件夹以及文件类型的限制就很重要了。还有就是有可能我们会对比如CAD图纸(.dwg、.dxf)的图签或者文件数据库(.db)的表名等特殊文件格式的自定义内容感兴趣。这时候就需要自己来实现扩展了。再加上很多时候,磁盘的信息都是敏感数据,一定要保证软件程序的安全。

因此,我们决定用C#开发一款开源的Windows平台全文搜索工具-TDSContent,并将整个开发过程中的思路与遇到的“坑”记录下来。最终代码与实现已完全开源。https://github.com/LdotJdot/TDSContent

TDSContent_Intro

我们接下来将对标AnyTxt的核心功能来TDSContent的技术实现。

二、从对标AnyTxt特性来设计TDSContent技术实现

在网上搜集了AnyTxt的特性与技术优势后,对应地对TDSContent在各个环节的实现进行了分析。具体如下:

image

2.1 对标AnyTxt(速度): 1 秒内出结果,自建索引,检索延迟 < 100 ms

文件全文关键词检索的方式大致分两种:

直接检索,先枚举出候选文件,在文件中查询出结果,返回对应文件信息。

索引检索,在索引中匹配关键词,生成索引匹配结果,返回索引匹配结果对应的文件信息。

直接检索适合于纯文本类的高效搜索,此时信息的读取成本低,即从文件中读取文本与转化速度都快。比较有代表性的就是ripgrep这类工具,直接开多个线程快速扫描所有;

索引检索适合信息量较大、信息的读取成本较高的场景,例如文件读取速度较慢或读取后存在较耗时文本解析过程。此时就需要提取解析文件,将文本索引存储好,提高后续搜索速度。比较有代表性的就是ElasticSearch这类工具。

为了更好支持更多类型文件内容搜索,TDSContent选择的是索引检索这种模式,采用了与ElasticSearch同样的Lucene的.net移植版本Lucene.net作为索引架构。该架构提供了完整的查询引擎和索引引擎,内部通过倒排索引查询,速度响应非常快。对于每个目标文件夹,我们都将单独进行索引创建维护,这样在近实时的更新写入与读取时都有非常好的性能。

现使用是Lucene.Net.Analysis.SmartCn(4.8.0-beta00017,要勾选预览版本才能在Nuget中搜得到),自带了支持中文分词的Analyzer。

2.2 对标AnyTxt(格式):100+ 文档类型,包括 Office/WPS/PDF/EPUB/MOBI/CHM/HTML/TXT/代码/思维导图等

文件内容的检索主要对象就是文本。对文档格式的支持无非就是将文件转换为我们感兴趣的文本信息部分。对于纯文本文件可以直接读取即可,如果是其他类型则需要进行解析转换。

TDSContent默认内置的转换器用开源库实现了几种常用格式的解析:

PDF: 选择PDFiumCore(Apache-2.0 license),它是对PDFium(BSD-3-Clause license)的封装,可从Nuget直接拉取,提供了.NET的接口,可以直接提取出可读的string文本无需额外转换。其他试过的还有貌似效果更好的iTextSharp,但他的协议AGPL v3,怕有风险。

docx,pptx: 用Open-XML-SDK(MIT),Nuget直接拉取简单易用。

dwg: 用ACadSharp(MIT)。现在dwg的解析库已经相对成熟了(遥想几年前dwg的解析还是个难题,还得用Teigha转dxf后再处理)。

dxf: 用netDxf(MIT),可从Nuget直接拉取。ACadSharp也能解析dxf,但实测下来部分dxf会报错,而netDxf兼容性更好。

doc,ppt: 20251018新增,用mit开源库实现二进制文件的文本读取(https://github.com/mayswind/SimpleOfficeReader)

纯文本: 直接用C#代码读取,包括txt,md,json,log,ini等。

大家可以通过实现项目中的IFileToStringConverter接口,实现自己的格式解析器。

public interface IFileToStringConverter : IDisposable

{

string Extension { get; }

string Convert(string filepath);

}

2.3 对标AnyTxt(OCR):图片 & 扫描件可搜,支持 JPG/PNG/扫描 PDF,内嵌 CPU/GPU 双引擎

TDSContent中对于图片OCR解析转换暂无相关计划,有需要的话可以自己实现。可以考虑使用Tesseract实现本地图片的解析。

2.4 对标AnyTxt(搜索语法):支持精准 / 模糊 / 正则,AND/OR/NOT、通配符、二次结果内筛选

由于基于的是Lucene索引框架,因此TDSContent能支持Lucene的所有查询方式,主要包括:

查询方式 意义

TermQuery 精确查询

TermRangeQuery 查询一个范围

PrefixQuery 前缀匹配查询

WildcardQuery 通配符查询

BooleanQuery 多条件查询

PhraseQuery 短语查询

FuzzyQuery 模糊查询

TDSContent默认的是采用”短语查询“,其他查询方式未UI中还未开放,但内部基本已实现。

2.5 对标AnyTxt(预览):右侧浮窗高亮关键词,无需打开源文件即可复制文本、翻译、跳转目录

尽管我们在Lucene引擎中,对每个文件的文本内容是通过索引的方式执行了全文存入的。但是我们没有做预览窗口。为了简洁,仅在目标结果文件下方做了最多5行的高亮匹配文本展示。

results

其他如翻译功能也没实现。

2.6 对标AnyTxt(索引策略):实时监控 + SSD 优化,自动增量更新,AES-256 加密缓存,支持网络共享盘

TDSContent没有实时监控线程。因此文件的更新是通过索引项目的USN日志实现。基于USN的好处是,哪怕用户在程序关闭状态下执行内容修改、重命名、文件夹修改、路径移动等操作,当下一次程序启动时,会依照记录自动实现对应索引结构更新。这样会非常经济且高效,不会有严重的卡顿以及频繁扫盘等问题,尤其不影响笔记本续航,缺点就是必须依赖USN。

2.7 对标AnyTxt(扩展性)

本项目为开源免费软件,可任意扩展。

三、其他

http://www.cnnetsun.cn/news/15219.html

相关文章:

  • 2024年全国平均身高数据统计可视化分析
  • 1小时打造Mac专属SSH工具:快马平台实战
  • PIKE-RAG知识库本地化部署之分块
  • DREAM3D完整指南:从入门到精通的材料科学数据分析解决方案
  • 靠谱的自动供包环线分拣机生产厂家
  • 5分钟用VSCode在Ubuntu上搭建Web应用原型
  • 24小时挑战:用AI快速打造‘旺仔‘风格IP原型
  • 零基础搞定Umi项目自动化部署:从代码到上线的完整指南
  • 数学分析简明教程——6.2
  • SSM物业缴费管理系统u8mx4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
  • 如何在PowerPoint中轻松插入LaTeX公式:终极解决方案
  • Ultralytics YOLOv11终极性能优化:从配置到实战的完整指南
  • 突破传统:3大实战方法让GLM语言模型成为你的AI生产力工具
  • 3步快速解决HeyGem.ai性能问题:终极优化指南
  • 自助项目全解析:适配老板画像业态选择指南
  • 传统链表OUT了!侵入式链表让Nginx、TCMalloc 性能飞跃的秘密武器
  • MinIO效率革命:传统存储方案对比实测
  • AI如何帮你彻底理解box-sizing的奥秘
  • 如何用AI自动生成OpenRGB灯光控制脚本
  • 告别深夜改Bug!CodeGenie帮你快速“驯服”鸿蒙编译错误!
  • 企业IT运维:批量处理设备启动故障(代码10)实战
  • 3天掌握VAR模型:零基础搭建GPT式图像生成系统
  • Headless Recorder完整指南:从零掌握浏览器自动化脚本生成
  • 终极指南:如何用ConvNeXt实现高效语义分割(UperNet完整教程)
  • 包装设计创意大比拼,谁才是行业王者?
  • 项目分享|Tabby:打造你自己的智能代码补全服务
  • 终极音频解锁指南:3分钟掌握浏览器端音乐格式转换
  • Word中批量给手机号打码,分享2种高效加密方法!
  • 5大核心优势解析:为什么Screenbox成为Windows平台最佳免费播放器
  • 【必学收藏】RAG技术详解:解决大模型幻觉的终极指南,从入门到实战