【问题标题】:Caching Lucene.net search results缓存 Lucene.net 搜索结果
【发布时间】:2013-03-02 03:22:12
【问题描述】:

我使用Lucene.net 在几个小型网站上实现了搜索功能(针对数据库内容和上传的文档),没有任何问题。现在我有一个网站,我正在索引 5000 多个文档(主要是 PDF)并且查询变得有点慢。

我假设加快速度的最佳方法是实现某种缓存。谁能给我关于从哪里开始的任何指示/示例?如果您除了缓存还有其他建议(例如,我应该使用多个索引吗?)我也想听听。

编辑:

导致查询缓慢的愚蠢用户错误。我一次为整个结果集创建了亮点,而不仅仅是我正在显示的“页面”。哎呀。

【问题讨论】:

    标签: c# performance caching lucene.net


    【解决方案1】:

    我将在这里做一个很大的假设,并假设您在查询索引的调用之间没有挂在索引搜索器上。

    如果这是真的,那么您绝对应该为您的索引的所有查询共享索引搜索器。随着索引变得更大(并且它实际上并不需要变得非常大才能成为一个因素),重建索引搜索器将变得越来越多的开销。要使其正常工作,您需要同步对查询解析器类的访问(它不是线程安全的)。

    顺便说一句,Java 文档(我发现)同样适用于 .net 版本。

    有关您的问题的更多信息,请参见此处: http://wiki.apache.org/lucene-java/ImproveSearchingSpeed

    【讨论】:

      【解决方案2】:

      Lucene 使用自己的内部“缓存”机制使索引检索成为一种快速操作。不过,我认为缓存不是您的问题。

      5000 个索引的文档在大小上听起来微不足道,但这在很大程度上取决于您构建索引的方式、索引/存储的内容、查询(操作)的方式、文档大小等。

      请尽可能多地填写有关索引的信息。

      【讨论】:

        【解决方案3】:

        首先,Lucene 本身支持内存版本的目录:

        Lucene.Net.Store.RAMDirectory
        

        你可以像这样使用它:

        RAMDirectory idx = new RAMDirectory();
        
        // Make an writer to create the index
        IndexWriter writer =
            new IndexWriter(idx, new StandardAnalyzer(), true);
        

        如果这对你有用,但它使用了太多的内存,请编写一个包装器并将其公开为接口或 web 服务。或者,如果您只是想缓存查询的内容以控制实体何时从缓存中退出,您可以围绕 Lucene 编写一个包装器,该包装器显然会根据关键字为您缓存最常见的结果。

        我更喜欢前面提到的。使用 RAMDirectory 创建一个围绕 Lucene 存储的 Web 服务或服务项目。这样,如果索引很大,您可以将 Web 服务卸载到具有大量内存的另一台服务器上 - 并获得近乎即时的结果。

        【讨论】:

          【解决方案4】:

          一定要优化你的索引。

          此外,这是实现缓存的一种快速/简单/有效的方法:HttpRuntime.Cache.Add(...);

          您可以使用任何类型的项目/库中的 ASP.Net 缓存。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-07-31
            • 1970-01-01
            • 2013-11-28
            • 2010-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多