Warm tip: This article is reproduced from serverfault.com, please click

full text search-ASP.NET核心

(full text search - ASP.NET Core)

发布于 2020-11-27 04:32:20

我有接近1万个JSON文件(非常小)。我想提供搜索功能。由于这些JSON文件已针对特定版本进行了修复,因此我正在考虑在网站启动期间对文件进行预索引并加载索引。我不想使用外部搜索引擎。

我正在寻找图书馆来支持这一点。lucene.Net是一种流行的库。我不确定该库是否支持加载预索引数据。

  • 为JSON文档建立索引并存储索引结果(可能在单个文件中),并保存到文件存储服务(例如S3-控制台应用程序)。
  • 加载索引文件并响应查询。-ASP.NET核心应用

我不确定这是否可能。有哪些可用的选项?

Questioner
Rajeshaz09
Viewed
0
NightOwl888 2020-11-28 09:38:01

由于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作为文件系统虽然,我不确定与本地文件系统相比将如何执行。