我有接近1万个JSON文件(非常小)。我想提供搜索功能。由于这些JSON文件已针对特定版本进行了修复,因此我正在考虑在网站启动期间对文件进行预索引并加载索引。我不想使用外部搜索引擎。
我正在寻找图书馆来支持这一点。lucene.Net是一种流行的库。我不确定该库是否支持加载预索引数据。
我不确定这是否可能。有哪些可用的选项?
由于S3不是.NET特定的技术,而Lucene.NET是Lucene的逐行端口,因此你可以扩展搜索范围以包括与Lucene相关的问题。这里有一个答案,指出了可用于Lucene的S3实现,可以将其移植到.NET。但是,作者自己承认,实现的性能不是很好。
注意:我不认为这是重复的问题,因为最适合你的答案不是公认的答案,因为你明确声明你不想使用外部解决方案。
Lucene.NET的一些实现在这里和这里都使用Azure而不是AWS 。你可能会得到一些想法,可以帮助你为S3创建更理想的解决方案,但是创建自己的Directory
实现不是一件容易的事。
可以
IndexReader
从内存中的字符串读取索引文件吗?
可以使用RAMDirectory
具有复制构造函数的,该构造函数将整个索引从磁盘移到内存中。不过,复制构造函数仅在文件位于磁盘上时才有用。你可能会从S3中读取文件并将其放入RAMDirectory
。对于小型索引,此选项很快,但如果索引随时间增长,则无法扩展。对于具有多个并发线程执行搜索的高流量网站,它也没有进行优化。
从文档中:
警告:此类不适用于巨大的索引。超过数百兆的所有内容都会浪费资源(GC周期),因为它使用1024字节的内部缓冲区大小,从而产生数百万个byte [1024]数组。此类针对小型内存驻留索引进行了优化。在多线程环境中,它的并发性也很差。
建议在磁盘上使用大索引并使用
MMapDirectory
,这是直接在操作系统的文件系统缓存上运行的高性能目录实现,因此将数据复制到堆空间没有用。
调用该FSDirectory.Open()
方法时,它将选择一个针对当前操作系统优化的目录。在大多数情况下,它会返回MMapDirectory
,这是一个在幕后使用具有多个视图的System.IO.MemoryMappedFiles.MemoryMappedFile
类的实现。如果索引很大或有多个并发用户,则此选项的伸缩性会更好。
若要使用Lucene.NET的内置索引文件优化,必须将索引文件放在可以像普通文件系统一样读取的介质中。你可能不希望尝试使用S3的API来开发Lucene.NET解决方案,而可以尝试使用S3作为文件系统。虽然,我不确定与本地文件系统相比将如何执行。
谢谢@ NightOwl888。现在,我对可能的选择有了充分的了解。最简单的解决方案是在应用程序首次启动时将其下载并提取到字典中,然后将IndexReader指向该目录。