.net core ASP.NET核心-索引和搜索JSON文件

.net core ASP.NET核心-索引和搜索JSON文件,.net-core,full-text-search,lucene.net,.net Core,Full Text Search,Lucene.net,我有近10K JSON文件(非常小)。我想提供搜索功能。由于这些JSON文件是针对特定版本而固定的,所以我考虑在网站启动时对文件进行预索引并加载索引。我不想使用外部搜索引擎 我正在寻找图书馆来支持这一点。这是一个很受欢迎的图书馆。我不确定此库是否支持加载索引前数据 索引JSON文档并存储索引结果(可能在单个文件中),保存到文件存储服务,如S3-Console应用程序 加载索引文件并响应查询。-ASP.NET核心应用程序 我不确定这是否可能。有哪些可能的选项可用?由于S3不是特定于.NET的技

我有近10K JSON文件(非常小)。我想提供搜索功能。由于这些JSON文件是针对特定版本而固定的,所以我考虑在网站启动时对文件进行预索引并加载索引。我不想使用外部搜索引擎

我正在寻找图书馆来支持这一点。这是一个很受欢迎的图书馆。我不确定此库是否支持加载索引前数据

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

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

由于S3不是特定于.NET的技术,而Lucene.NET是Lucene的逐行端口,因此您可以扩展搜索范围,以包括与Lucene相关的问题。有一个例子指出了一个S3实现,它是为Lucene设计的,可以移植到.NET。但是,由作者自己承认,执行的性能不是很大

注:我不认为这是一个重复的问题,因为事实上,最适合你的答案不是被接受的答案,因为你明确地表示你不想使用外部解决方案。 Lucene.NET有几个实现使用Azure而不是AWS和。您可能会得到一些想法,帮助您为S3创建一个更优化的解决方案,但是创建自己的
目录
实现是一项非常重要的任务

IndexReader
能否从内存字符串中读取索引文件

可以使用
RAMDirectory
,它有一个复制构造函数,可以将整个索引从磁盘移动到内存中。但是,复制构造函数仅在文件位于磁盘上时才有用。您可以从S3中读取文件,并将它们放入
RAMDirectory
。对于小索引,此选项速度很快,但如果索引随时间增长,则不会进行缩放。对于具有多个并发线程执行搜索的高流量网站,它也没有进行优化

从:

警告:此类不适用于大型应用程序 索引。超过几百兆字节的所有内容都将被浪费 资源(GC周期),因为它使用内部缓冲区大小 1024字节,产生数百万字节[1024]数组。 此类针对小型内存驻留索引进行了优化。 它在多线程环境中的并发性也很差

建议在磁盘上具体化大索引并使用
MMapDirectory
,这是一个高性能目录 直接在服务器的文件系统缓存上工作的实现 操作系统,所以将数据复制到堆空间是没有用的

调用
FSDirectory.Open()
方法时,它会选择一个针对当前操作系统优化的目录。在大多数情况下,它返回
MMapDirectory
,这是一个使用引擎盖下多视图的实现。如果索引的大小很大或有许多并发用户,则此选项的扩展性会更好


要使用Lucene.NET的内置索引文件优化,必须将索引文件放在一个可以像普通文件系统一样读取的介质中。与其尝试推出一个使用S3 API的Lucene.NET解决方案,不如改为查看。尽管如此,与本地文件系统相比,我不确定它的性能如何。

如果应用程序在每个版本中不需要任何索引更改,为什么不将索引作为部署管道的一部分,并将
IndexWriter
完全从应用程序中删除?@NightOwl888 IndexWriter是发布管道的一部分。控制台应用程序在S3/Azure文件服务中索引和存储文件。我知道我们可以保存到目录,然后将该目录指向IndexReader。IndexReader可以从内存字符串中读取索引文件吗?谢谢@NightOwl888。现在我对可能的选择有了合理的理解。最简单的解决方案是在应用程序第一次启动时下载并解压缩到字典,然后将IndexReader指向该目录。