.net core ASP.NET核心-索引和搜索JSON文件
我有近10K JSON文件(非常小)。我想提供搜索功能。由于这些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的技
- 索引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指向该目录。