我在.NET堆栈中创建了一个文档存档管理系统。搜索功能目前有限。当用户进行搜索时,选择相关客户并查询“标题”,“定义”或“日期”字段。他们的记录太多了(大约500万)。我在搜索theese字段时没有任何问题。(BTW数据库是Sql Server。)
我们附上pdf或office文件进行记录。如果用户附加要记录的文件,我将文件保存到文件系统并将文件路径写入数据库。如果查询结果中有附件,用户可以打开文档点击路径。
我们希望索引附加文档并在索引中搜索。但我需要为每个客户创建索引。
总结我想要的东西;
我知道有技术可以做到这一点。 Lucene / Solr,sphinx等。但我很困惑,需要一个建议。
答案 0 :(得分:3)
听起来你正在探索以下选项:
我可以在 Apache堆栈中给你一些指示(因为你在帖子中提到了Lucene / Solr):
摘录强>
广泛使用的开源文档提取工具Apache Tika(可以处理PDF和MS Office文档among others)
您提到要索引 images ,在文档管理上下文中可能包含OCR,是吗?在开源社区(Apache 2许可)中,Google Tesseract OCR的支持越来越多。
Apache Tika最近以名称TikaOCR包含对Tesseract OCR的支持。
搜索强>
您已经在使用 SQL Server ,因此如果fulltext support满足您的需求,最初可能最简单,只需使用Tika生成纯文本即可添加为另一列(带有FULLTEXT索引)到SQL Server中的文档表。
合并基于Lucene的搜索服务器( Apache Solr 或 Elasticsearch )将极大地增强您调整搜索和公开最佳实践搜索功能的能力(自动完成,搜索方面,类似的搜索)。
Lucene.NET是另一种解决方案(C#库),但它没有跟上Lucene Java项目的步伐(上次更新2012)。此外,对于5MM以上的文档,您最好考虑使用基于服务器的进程外搜索解决方案。
多租户策略
最终,您有三个主要选择:
最终你可以使用SQL Server实现这三种方法中的任何一种(当前实现是#1,对吗?)。
使用任何搜索解决方案时,#3 - 单独的数据存储可能会随着客户端列表的增长而成本过高(除非需要防火墙关闭组织数据)。
许多多租户搜索应用程序使用#2 - 共享数据存储区,单独的搜索索引或#1 - 共享数据存储区,依赖于的共享索引。
Solr和Elasticsearch都可以让您为每个客户端设置一个文档索引/集合(#2),或管理一个大型多客户端集合,例如{{1}过滤字段(#1)。
使用商业Elasticsearch插件(Shield),可以提供索引级安全性,例如每个单独的面向客户端的.NET应用程序只能访问该客户端的文档索引(上面的#2策略)。
<强>集成强>
您正在使用.NET,可能不想与Java库进行争吵。 Solr和Elasticsearch都作为服务器运行,具有用于搜索和摄取的HTTP API。 Solr有一个名为Solr CELL的Apache Tika集成,Elasticsearch通过elasticsearch-mapper-attachments plugin project进行集成(这两者都可以使您免于Java开发)。
但是,Elasticsearch's Tika integration does not yet support Tesseract OCR(Solr's integration does)。
.NET clients for Elasticsearch(NEST正在大量使用)
扩展注意事项
OCR处理和文本提取是CPU密集型的,因此随着您的摄取量的增加,您最终可能会考虑在不用于搜索的专用机器上处理文档。
总之,假设您需要OCR,这些摄取/搜索堆栈中的任何一个都可以工作:
我希望这能为您的解决方案提供一个起点!