存储大型可搜索文本文件的最佳方式

时间:2011-09-17 23:52:52

标签: database search large-text large-data

我正在开发一个在线圣经搜索程序。圣经是一本非常大的书,占据了近5MB的纯文本空间。我计划在程序中实现API,以及允许其他网站包含他们自己的圣经搜索小部件和程序,而无需在自己的服务器上开发搜索查询或存储圣经。

考虑到这一点,我希望最终我会通过该程序获得适度的查询流。此外,对于那些不熟悉圣经的人,它有两种格式化文本的方法。它可以包含红色文本和斜体。我需要一种方法来存储圣经以及红色字母和斜体格式,但允许搜索查询忽略格式。

它还需要尽可能快速且高效(内存和CPU使用)。只要可以忽略格式化进行查询,就会考虑任何存储格式(MySQL,JSON或XML文本文件等)。文件大小和数量并不重要,所以我可以将书籍甚至章节拆分成单独的文件。

要记住的另一个重要的事情是,我希望有一种形式的搜索方法可以搜索多个经文。因此,寻找“但为上帝永生而不是他的儿子”将会回归约翰福音3:16,17 。谢谢你的所有想法!

2 个答案:

答案 0 :(得分:2)

有许多不同的开源文档搜索引擎,它们正是为了您正在尝试做的而制作的。 Solr,弹性搜索,Xapian,飞快移动,干草堆(为Django制作)和其他人。 S.O.还有其他帖子。在其他地方,使用一个与另一个的好处,但你的要求很简单,任何一个都不会很好(如果你的项目起飞,很容易用很小的努力扩展,这总是很好的知道)。所以看看他们的例子,看看哪一个看起来最直观 - 索尔可以说是最受欢迎的,它是我唯一合作过的,但Elastic Search使用相同的流行Lucene后端,显然更容易起床和跑步,所以我会从那里开始。

至于实际实现,如果单个经文(或仅仅是经文编号)是您想要返回的内容,您将希望将每个经文编入索引作为单独的“文档”。搜索引擎根据相关性处理结果的排名(通常使用tf / idf算法,以防您感兴趣)。

我处理斜体和红色文本的方式是在文本中包含某种标记(即将短语包装为斜体的单个星号,红色的双星号)然后告诉分析器忽略这些字符 - 但是,在你最终选择的框架中可能会有一种更简单的方法,所以请尽量使用。跨越多个经文要求的查询更复杂,但答案可能涉及将每个整章作为文档索引而不是(或者可能除此之外?我还要考虑更多)每节经文。

需要注意的是 - 如果您不熟悉搜索索引,即使像Elastic Search这样即插即用的内容也可能需要花费一些时间和精力来设置,所以如果您绝对需要来快速启动和运行你已经熟悉MySQL了我认为它可以工作(它确实可以进行全文搜索)。但它肯定不是这项工作的最佳工具,所以如果这是一个你投资的项目,如果你投入一些工作来学习其中一个搜索框架,你会感谢自己。正如其他人所指出的那样,对于你正在处理的文本数量而言可能有些过分,但是如何搜索那些似乎是你想要的文本会非常灵活。例如,稍后添加其他要求将非常简单(例如,您可以让人们将搜索限制为仅匹配红色文本中的匹配)。

答案 1 :(得分:1)

我不知道圣经有格式化。它是干什么用的?如果是这些经文,我建议你将每节经文存储在一个数据库中。在一个高度标准化的形式,你有一张桌子上有书,一张桌子和一个带有经文的桌子。每节经文都包含一节经文和一节经文。

现在,我认为这些章节没有标题,所以它们实际上只是一个数字。在这种情况下,将它们分开存放是很愚蠢的,所以你只需要你的书桌和一个经文表,其中每节经文都有一个章节编号,一节经文和一节经文。那个文字我认为是纯文本,不是吗?

如果这节经文是纯文本,您可以通过将其存储在MySQL中并为其创建FULLTEXT索引来轻松地进行搜索。这样,您可以非常有效地搜索,甚至可以使用通配符等。

如果这节经文要格式化,你可以选择创建两列,一列用纯文本进行搜索,另一列用格式化文本进行显示,但我怀疑你是否需要格式化。

PS:5 MB的文字并不是真的。如果你有一个专门的程序,你可以将它保存在单个字符串的内存中,并使用strpos或类似的函数来查找文本。你使用什么语言,数据库和平台?