我需要开发一个可以搜索一本书并列出包含给定关键字的所有页面和行的应用程序。
对于以其他方式拆分的书籍,例如按章节和经文拆分的圣经;他们将能够搜索包含某个关键字的所有经文。或者,在某些章节和经文中搜索关键字。
我应该以什么格式存储这本书?是否应该将其存储到 SQL 数据库中?
哪种格式最容易搜索而不是最容易存储?
我需要开发一个可以搜索一本书并列出包含给定关键字的所有页面和行的应用程序。
对于以其他方式拆分的书籍,例如按章节和经文拆分的圣经;他们将能够搜索包含某个关键字的所有经文。或者,在某些章节和经文中搜索关键字。
我应该以什么格式存储这本书?是否应该将其存储到 SQL 数据库中?
哪种格式最容易搜索而不是最容易存储?
它取决于您想要运行它的环境,以及您期望每秒查询多少次。
最快的方法是将哈希表中的每个单词存储到内存中,并且值包含对章节/经文的引用,或者您想要检索的任何名称。
但是如果书很大,或者客户端很瘦,这可能无法很好地扩展。
您可以将每节经文存储在数据库记录中,并使用全文搜索进行搜索。但是,如果您需要在网站上托管应用程序,则需要确保您选择的数据库的托管成本不超过您的预算。
如果您的应用程序负载可以处理它,您还可以将每节经文存储在文本文件(纯文本、XML 或任何其他格式)中,并扫描每个文件,最好使用 XPATH 或正则表达式。一个非常便宜且简单的解决方案,您可以随心所欲地进行高级操作,但可能会更慢。再说一次,如果您每小时只需要处理 1 个请求,为什么不呢?
我会将数据库与全文搜索一起使用,因为它的扩展性最好。
几年前,你是一本已经存储在 Access 数据库中的圣经,我曾经用它来制作一个与你所说的完全一样的应用程序。Access DB 可以免费下载。几年前,我在 XML 中遇到过一个。我不能在工作中做到这一点,但我建议你搜索 Access Bible 或 XML Bible,看看你是否能找到它。(我认为最初的 Access 可能被称为 ASP Bible)。无论如何,如果你能找到它,它应该能让你很好地了解如何构建你的数据库。
该程序应该搜索任何书籍还是仅搜索特定书籍?圣经以外的书籍没有像圣经那样分为章节和经文的内容。答案将取决于这本书目前的格式。
我建议使用像Lucene.NET这样的现成全文引擎。如果您自己动手,您将获得各种无法获得的功能。
您是否期望同一本书有多个查询?即,您是否要对每本书进行可能需要大量时间的预处理,但每本书只能进行一次?否则,boyer-moore 可能是最好的选择。您只想搜索完整的单词还是单词的开头?对于完整的话,一个简单的哈希表可能是最快的。如果您想查找单词的一部分,我建议使用后缀树。
当您知道您正在使用什么算法时,确定最佳数据结构(数据库、平面文件等)应该是一个更容易的选择。
您可以查看Boyer-Moore(另外,这包含指向其原始论文的链接)算法
不幸的是,Boyer-Moore 算法在较长的字符串上比在短的“关键字”搜索上要快得多。因此,对于关键字搜索,您可能希望实现某种可以索引可能的搜索词的爬虫。
另一个令人不安的考虑是,在大多数书籍中,章节仅包含在某些页面上,而对于圣经,章节和经文可以分成多个页面,并且页面可以包含多个经文和章节。
这意味着,如果您按经文拆分文本,那么任何跨越经文边界的搜索短语都将没有结果(或不正确的结果)。
另一个考虑因素是邻近搜索,例如您是否需要精确的搜索词组,或者只需要一组关键字。
我认为第一个也是最重要的任务是敲定并强化您的要求。然后你应该弄清楚你收到书的格式是什么。一旦你知道了你的限制,你就可以开始做出你的架构设计决策。
def findWord(keyword):
f = open("book.txt")
for line in f: # horribly bad performance for a large block of text
if line.find(keyword) > -1:
print line
将每一行替换为您特定圣经示例的一段文本。你如何存储文本真的无关紧要。您所做的只是在一些给定的文本(很可能在循环中)搜索关键字。
如果要搜索行号和其他任意字段,最好将信息存储在具有相关字段的数据库中,并在任何相关字段上运行搜索。
仅供参考 - 上面的代码是 Python。