我有一个包含匿名医疗数据(年龄,国家,症状,诊断等)的文本文件集合。这些数据可以追溯到至少30年前,所以你可以想象我有一个相当大的数据集。我总共有大约20,000个文本文件。1TB。
我将需要定期搜索这些文件中出现的特定字符串(不是正则表达式)。搜索这些数据的最快方法是什么?
我尝试使用grep并递归搜索目录,如下所示:
LC_ALL=C fgrep -r -i "searchTerm" /Folder/Containing/Files
唯一的问题是,这需要几个小时(有时是半天!)来搜索这些数据。
有没有更快的方法来搜索这些数据?目前,我对不同的方法持开放态度,如数据库,elasticsearch等。如果我真的沿着数据库路线走下去,我将有大约。十亿条记录。
我唯一的要求是:
1)搜索将在我的本地计算机上进行(双核CPU和8GB RAM)
2)我将搜索字符串(而不是正则表达式)。
3)我需要看到的搜索字符串和它的文件内的所有事件。
8条答案
按热度按时间mccptt671#
Fs Crawler可能会帮助你将数据索引到elasticsearch中。之后,正常的elasticsearch查询可以成为搜索引擎。
umuewwlo2#
我认为,如果你缓存最近搜索的医疗数据,它可能会有助于性能方面,而不是通过整个1 TB,你可以使用redis/memcached
zzzyeukh3#
现在已经有很多答案了,我只想补充我的两分钱:
1.有这么多的数据(1 TB)只有8 GB的内存对于任何方法都不够好,无论是使用Lucene还是Elasticsearch(内部使用Lucene)或一些grep命令,如果你想要更快的搜索,原因很简单,所有这些系统都将数据保存在最快的内存中,以便能够更快地提供8 GB的服务(25%你应该保留的操作系统和其他25-50%至少为其他应用程序),你留下了很少GB的RAM。
1.升级SSD,增加系统上的RAM将有所帮助,但它非常麻烦,如果您遇到性能问题,则很难对系统进行垂直扩展。
建议
1.我知道你已经提到你想在你的系统上这样做,但正如我所说,它不会给给予任何真实的好处,你可能会浪费这么多时间(下文和代码方面(在各种答案中提到的许多方法)),因此建议你做我的another answer for determining the right capacity中提到的自顶向下的方法。它将帮助您快速确定您选择的任何方法的正确容量。
1.关于实现方面,我建议使用Elasticsearch(ES),因为它非常容易设置和扩展,你甚至可以使用AWS Elasticsearch,它也可以在免费层中使用,然后快速扩展,虽然我不是AWS ES的忠实粉丝,它节省了大量的设置时间,如果你非常熟悉ES,你可以快速开始。
1.为了使搜索更快,你可以将文件分割成多个字段(标题,正文,标签,作者等),只索引重要的字段,这将减少倒排索引的大小,如果你只寻找精确的字符串匹配(没有部分或全文搜索),那么你可以简单地使用
keyword
字段,这是更快的索引和搜索。1.我可以继续讨论为什么Elasticsearch很好以及如何优化它,但这不是关键,底线是任何搜索都需要大量的内存,CPU和磁盘,任何一个成为瓶颈都会阻碍您的本地系统搜索和其他应用程序,因此,建议你真正考虑在外部系统上这样做,Elasticsearch确实是分布式系统的一种手段,也是最流行的今天的开源搜索系统。
nzrxty8p4#
你显然需要一个索引,几乎所有的答案都建议。你完全可以改进你的硬件,但既然你说它是固定的,我就不详细说明了。
我有几个相关的提示给你:
1.仅索引您要查找的搜索项的字段,而不是索引整个数据集;
1.创建多级索引(即索引(index over index),以便索引搜索更快。这将是特别相关的,如果您的索引增长到超过8 GB;
1.我想推荐缓存您的搜索作为一种替代方案,但这将导致一个新的搜索再次需要半天。因此,预处理数据以构建索引显然比在查询到来时处理数据更好。
小更新:
这里的很多答案都建议你把数据放在云端。我强烈建议,即使是匿名的医疗数据,你也要与来源确认(除非你从网上抓取数据)。
92dk7w1h5#
要加快搜索速度,您需要一个inverted index。为了能够添加新文档而不需要重新索引所有现有文件,索引应该是增量的。
最早引入增量索引的开源项目之一是Apache Lucene。它仍然是最广泛使用的索引和搜索引擎,尽管其他扩展其功能的工具现在更受欢迎。Elasticsearch和Solr都基于Lucene。但是,只要你不需要一个Web前端,支持分析查询,过滤,分组,支持索引非文本文件或基础设施的集群设置在多个主机,Lucene仍然是最好的选择。
Apache Lucene是一个Java库,但它附带了一个功能齐全的、基于命令行的演示应用程序。这个基本的演示应该已经提供了你需要的所有功能。
有了一些Java知识,也很容易使应用程序适应您的需求。您会惊讶于演示应用程序的源代码是多么简单。如果Java不应该是你选择的语言,它的Pyhton Package 器PyLucene也可能是一个替代品。演示应用程序的索引已经减少到几乎最低限度。默认情况下,不会使用高级功能,如复杂查询的词干提取或优化-功能,您很可能不需要您的用例,但会增加索引的大小和索引时间。
laawzig26#
我给你三个选择。
1.你真的应该考虑升级你的硬件,硬盘驱动器->固态硬盘升级可以成倍的搜索速度。
1.加快现场搜索速度。您可以参考this question以获得各种建议。这种方法的主要思想是优化CPU负载,但你会受到硬盘速度的限制。最大速度乘数是您的核心数量。
1.您可以索引数据集。因为您正在处理文本,所以需要一些全文搜索数据库。Elasticsearch和Postgres都是不错的选择。这种方法需要更多的磁盘空间(但通常小于x2空间,具体取决于数据结构和要索引的字段列表)。这种方法将无限快(秒)。如果您决定使用此方法,请仔细选择分析器配置,以匹配被视为任务的单个单词(对于Elasticsearch,为here is an example)
tkclm6bt7#
值得从两个层面来探讨这个主题:方法和使用的特定软件。
途径:根据您描述数据的方式,似乎预索引将提供重要的帮助。预索引将对数据执行一次扫描,并将构建一个紧凑的索引,使其能够执行快速搜索并识别存储库中显示的特定术语。
根据查询的不同,索引将减少或完全消除对实际文档的搜索,即使是复杂的查询,如“查找AAA和BBB一起出现的所有文档”。
具体工具
你描述的硬件是相对基本的。运行复杂的搜索将受益于大内存/多核硬件。有很好的解决方案-ElasticSearch,solr和类似的工具可以做魔术,给予强大的硬件支持。
我相信你想看看两个选项,根据你的技能,和数据(这将有助于样本的数据可以共享)由OP. * 建立自己的索引,使用轻量级数据库(sqlite,postgresql),或者 * 使用轻量级搜索引擎。
对于第二种方法,使用describe hardware,我建议查看'slightly'(以及支持agrep实用程序)。Glimple提供了一种预索引数据的方法,这使得搜索速度非常快。我在大数据存储库上使用过它(只有几GB,但从来没有TB)。
参见:https://github.com/gvelez17/glimpse
显然,它不像Elastic Search那样现代和功能丰富,但更容易设置。它是无服务器的。OP描述的用例的主要好处是能够扫描现有文件,而不必将文档加载到额外的搜索引擎存储库中。
mmvthczy8#
你能考虑把所有这些数据都输入到elasticsearch中,如果它们有一个一致的数据结构格式的话吗?