代码之家  ›  专栏  ›  技术社区  ›  Dan Fitch

当索引发生变化时,使用solr高效地进行排序和分页

  •  1
  • Dan Fitch  · 技术社区  · 14 年前

    我正在开发一个结构化的文档查看器,其中每个solr文档都是一组法律文档中的“部分”或“段落”,以及各种元数据。我有一个语料库,它可能代表这些部分的10^12或更多。我想为用户提供分页,以便他们可以在 sort_path 秩序。


    现在的问题是:即使 分类路径 是索引的,有文档一直在添加和删除。一个简单的排序和分页解决方案最终将导致用户可能会意外地跳过部分或在排序过程中跳来跳去,即使他们不在排序过程中添加/删除的文档附近;这种行为是不可接受的。

    示例:我使“下一页”链接指向 ...sort_order=sort_path+desc&rows=N&start:12345 . 然后,当用户查看页面时,将删除排序路径顺序中的早期文档。现在,当他们获取下一个n行时,他们将跳过1个不知道的文档。

    所以,如果我有 分类路径 字段,用于订购部分,前端需要能够要求“之前”或“之后”有n个部分 sort_path:/X/Y/Z 而不是要求 rows:N 具有 start:12345 . 我不知道如何在solr查询中表示这一点。


    我可能把solr的边缘推得有点远了,最终可能会更有意义地将这些“部分”文档的表示存储在solr(对于内容搜索,solr非常擅长)和RDBMS(对于排序和索引)。我本来想避免这种情况,但这种查询在数据库中仍然很难看,所以也许你有一些想法。(谢谢!)


    更新:

    事实证明,结合排序的solr范围可以给我确切的需要。在索引字段上,我可以执行如下操作

    sort_path:["/A/B/C" TO *]
    

    获取“下一个”n节,然后

    sort_path:[* TO "/A/B/C"]
    

    按序排序 sort_path:desc 然后反转返回的块以获取前面的n个部分。我将测试这个解决方案的性能,但它似乎是可行的。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Mauricio Scheffer    14 年前

    这实际上不是一个特定于solr的问题,而是任何外部数据源分页的一般问题,因为数据源具有独立于(web)应用程序的状态。例如,它也发生在关系数据库上。 Here's 在关系数据库中很好地覆盖分页,以及可能的解决方案。大多数Web应用程序/网站都采用第一种解决方案:“对每个新请求重复查询”,因为其他解决方案更复杂且不可扩展,但这会受到您描述的问题的影响。浏览stackoverflow.com上的问题一段时间,您会注意到,因为问题是不断创建的。

    在您的案例中,我考虑将Solr文档建模为您的整个法律文档,而不是它们的单独部分。您将得到更少的文档(因此插入/删除的速度较慢),并且可以使用 highlighting parameters 获取与用户查询匹配的节的片段。

    另一个选择是降低提交率,但最终可能会导致文档的新鲜度低于理想值。