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

当索引发生变化时,使用Solr高效地进行排序和分页,solr,Solr,我正在开发一个结构化文档查看器,其中每个Solr文档都是一大组法律文档中的“部分”或“段落”,以及各种元数据。我有一个语料库,可能代表10^12或更多的这些部分。我想为用户提供分页功能,以便他们可以按sort\u path顺序一次查看N个这些部分 现在的问题是:即使索引了sort\u path,也会一直添加和删除文档。一个简单的排序和分页解决方案最终会导致用户可能跳过部分或意外地在排序中跳转,即使他们离在排序中添加/删除的文档很远;这种行为是不可接受的 示例:我将“下一页”链接点设置为类似于…

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


现在的问题是:即使索引了
sort\u path
,也会一直添加和删除文档。一个简单的排序和分页解决方案最终会导致用户可能跳过部分或意外地在排序中跳转,即使他们离在排序中添加/删除的文档很远;这种行为是不可接受的

示例:我将“下一页”链接点设置为类似于
…sort\u order=sort\u path+desc&rows=N&start:12345
。然后,当用户查看页面时,将删除排序路径顺序中较早的文档。现在,当他们获取接下来的N行时,他们将在不知道的情况下跳过1个文档

因此,如果我有一个排序分区的
sort\u path
字段,前端需要能够在
sort\u path:/X/Y/Z
之前或之后请求N个分区,而不是使用
start:12345
请求
行:N
。我不知道如何在Solr查询中表示这一点


我可能会把Solr的边缘推得更远一点,而将这些“部分”文档的表示形式存储在Solr(用于内容搜索,Solr非常擅长)和RDBMS(用于排序和索引)中可能会更有意义。我希望避免这种情况,而这种查询在数据库中仍然会很糟糕,所以也许你有一些想法。(谢谢!)


更新: 事实证明,solr范围与排序相结合,可能会给我确切的需要。在索引字段中,我可以执行以下操作

sort_path:["/A/B/C" TO *]
要获取“下一个”N节,请执行以下操作

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

sort\u path:desc
排序,然后反转返回的块以获得前面的N个部分。我将测试此解决方案的性能,但它似乎是可行的。

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

在你的情况下,我会把SOLR文档建模为你的整个法律文档而不是他们的各个部分。您将获得更少的文档(因此插入/删除速度较慢),并且可以使用获取与用户查询匹配的部分片段


另一种选择是降低提交率,但这可能会导致文档不够新鲜。

在索引单个文档后,是否必须添加或删除其节和/或段落?很遗憾,是的。理想的做法是跟踪段落级别的更改。+1索引整个文档可能是最简单的方法,如果在您的情况下可行的话。谢谢Mauricio,一些好的想法。为整个文档编制索引的问题是,我希望能够在UI中向用户呈现较小的文档子集,因为其中一些文档长达数千页。我想在每个段落中存储div,并能够“零碎地”将它们呈现给用户,但正如您所说,分页时这是一个普遍的问题。@Dan Fitch:突出显示如何?当我说零碎地存储div时,我的意思是我想使用Solr来存储节的实际标记,而不仅仅是纯文本内容,然后不仅仅是搜索这个语料库:需要有一种方法来浏览整个“文档”,方法是将部分的“子集”组合成一个可查看的块。对不起,这不是特别清楚,我的头脑也不是特别清楚。:)