0

我正在为一家小型在线文档管理公司编写 Web 脚本,该公司希望允许用户快速在线搜索其文件的内容。虽然许多帐户非常小(不到 100 个 2MB 文件),但也有少数帐户拥有 1,000,000 个或更多文件。需要支持 PDF 和 DOC/DOCX。二进制文件不会被索引。

我们正在寻找提供基本搜索结果的简单解决方案。没什么太花哨的。每个用户都有一个主文件夹(搜索只会搜索他的子文件夹),所以请记住,搜索系统应该是最佳的。为了说明,如果一个拥有 100 MB 帐户的人搜索他的主文件夹,它会感觉不要搜索其他 4 TB 的文件。

你有什么建议?

这是我正在查看的一些选项:

1) 我正在考虑使用 Windows 搜索来解决这个问题——无论是命令行工具还是使用 API。但每台服务器实际上可以有 10 亿个文件,并且前 3 个结果应该立即交付。Windows 搜索会吗?或者这会产生挫败感?

2)自定义:制作一个简单的开源MySQL数据库程序来保存索引信息。英语中大约有 100,000 个单词……然后是自定义单词和首字母缩略词……因此,为了快速查找,根据单词和用户帐户进行索引是有意义的。我将进行预处理,使“慢跑”变成“慢跑”,“摆弄”变成“小提琴”,以降低数据库大小。 给定每台服务器 150 个客户帐户,拥有一个大数据库是否有意义,或者可能消除 UserID 字段并为每个用户提供一个数据库?

Tables:
Table WorldTable
EnglishWord (pk) | WordID (fk)

Table FileTable
FileID (pk) | FilePath

Table WordIndex
WordID (pk) | FileID (fk) | UserID | SettingsPatternID

Table Settings
SettingsPatternID | Top (bool) | IsWordForm (bool)

IsWordForm = 表示它不是完全匹配,而是单词的一种形式。例如:文件中的单词最初在文档中是“慢跑”或“跳舞”,但以缩写形式“慢跑”或“跳舞”归档。(如果查询也是 wordform,那么它有助于提高相关性。) IsWordForm 的可能性很高。Top = Word 位于文档的前 50 个单词(表示标题)

我想要 5-15% 的小存储开销。CPU 非常宝贵...但是,对于每个文件,这是很多开销,因为每个文件都会在 WordIndex 中生成数千条记录。即:

WordID, FileID, UserID, SettingsPatternID
WordID, FileID, UserID, SettingsPatternID
WordID, FileID, UserID, SettingsPatternID

... 这是最长的表,WordID 是不必要的重复。

3) 哈希,使用 MySQL 既然我们知道这将是一个词的搜索,一个纯粹的关系数据库可能不是最好的模型......

将每个单词“散列”到匹配文件列表可能更有效。例如:对于每个单词,制作一个 2 列表。您无需在表格中“查找”单词,因为我们知道它是什么。这个列表可以是每个单词的 2 列表:

Table *The Word*
FileID | UserID | SettingsPatternID
(There would be 100,000 of these. One for each unique word.)

Table Settings
SettingsPatternID | Top (bool) | IsWordForm (bool)

4)我也看过 SolR,但我认为这有点过头了。这是一个糟糕的假设吗?虽然它支持 PDF 和 DOC,但集成起来也是相当多的工作......我几乎觉得自己做这件事的工作量是一样的,但当然,作为一名编码人员,我知道这种假设经常是错误的...... .

请大家思考!!!

4

1 回答 1

2

4)我也看过 SolR,但我认为这有点过头了。这是一个糟糕的假设吗?虽然它支持 PDF 和 DOC,但集成起来也是相当多的工作......我几乎觉得自己做这件事的工作量是一样的,但当然,作为一名编码人员,我知道这种假设经常是错误的...... .

绝对选择 SolR集成成本更高,但设置更容易,维护也更容易。

此外,它已经具有许多您必须自己实现(以及调试和维护......)的功能。

但是,我建议审查 SolR 的功能,围绕这些功能设计一个基本界面,并以书面形式批准。“文本搜索”往往成为一种不言而喻的“我希望系统能够读懂我的想法”。另外,解释高效的文本搜索不是“简单的脚本”;实际上有成千上万的博士学位。论文涉及语义、词干、相关性、邻近性等。其中许多论文已经进入 SolR/Lucene。

如果您假设用户可能对grep性能、可扩展性和结果方面都感到满意,那么 SolR 是“矫枉过正” 。相信我,他们不会

您可以尝试推荐一个Google Machine。它还有助于建立与成本相关的基准:即,“如果您想要 Google 的性能,这就是 Google 的价格。没有 Google 的规模经济的任何其他临时实施将花费更多来实现相同的性能水平”。

于 2012-10-19T09:48:32.223 回答