【问题标题】:ASP.NET Core - Indexing and searching JSON filesASP.NET Core - 索引和搜索 JSON 文件
【发布时间】:2020-11-27 04:32:20
【问题描述】:

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

我正在寻找支持这一点的库。 lucene.Net 是一个受欢迎的图书馆。我不确定这个库是否支持加载预索引数据。

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

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

【问题讨论】:

  • 如果应用程序不需要在每个版本中更改任何索引,为什么不将索引作为部署管道的一部分并将IndexWriter 完全排除在应用程序之外?
  • @NightOwl888 IndexWriter 是发布管道的一部分。控制台应用程序在 S3/Azure 文件服务中进行索引和存储文件。我知道我们可以保存到目录,然后将该目录指向 IndexReader。 IndexReader 可以从内存中的字符串中读取索引文件吗?

标签: .net-core full-text-search lucene.net


【解决方案1】:

由于 S3 不是特定于 .NET 的技术,而 Lucene.NET 是 Lucene 的逐行移植,因此您可以扩展搜索以包括与 Lucene 相关的问题。有一个answer here 指向一个用于 Lucene 的 S3 实现,可以移植到 .NET。但是,作者自己也承认,实现的效果并不好。

注意:我不认为这是一个重复的问题,因为最适合您的答案不是公认的答案,因为您明确表示您不想使用外部解决方案。

Lucene.NET 有几个实现使用 Azure 而不是 AWS herehere。您可能会得到一些想法来帮助您为 S3 创建更优化的解决方案,但创建自己的 Directory 实现并非易事。

IndexReader可以从内存字符串中读取索引文件吗?

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

来自documentation

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

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

当您调用FSDirectory.Open() 方法时,它会选择一个针对当前操作系统进行了优化的目录。在大多数情况下,它返回MMapDirectory,这是一个在底层使用System.IO.MemoryMappedFiles.MemoryMappedFile class 和多个视图的实现。如果索引很大或者有很多并发用户,这个选项会更好地扩展。

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

【讨论】:

  • 感谢@NightOwl888。现在我对可能的选择有了公平的理解。最简单的解决方案是在应用程序第一次启动时下载并解压到字典,然后将 IndexReader 指向该目录。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 2016-03-16
  • 1970-01-01
  • 2021-03-10
  • 2017-07-07
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多