random_x(randomsortfield)在solr云中是否会出现意外行为?

rekjcdws  于 2021-10-10  发布在  Java
关注(0)|答案(0)|浏览(241)

我们知道,solr有一个randomsortfield,可以通过以下请求调用: http://localhost:8983/solr/select/?q=*:*&fl=name&sort=random_1234%20desc 我们知道,如果种子是相同的(假设文档不变),那么这个功能意味着结果总是具有相同顺序的确定性。
核心功能由以下因素驱动:

/*
 * Given a field name and an IndexReader, get a random hash seed.
 * Using dynamic fields, you can force the random order to change
 */
private static int getSeed(String fieldName, LeafReaderContext context) {
    final DirectoryReader top = (DirectoryReader) ReaderUtil.getTopLevelContext(context).reader();
    // calling getVersion() on a segment will currently give you a null pointer exception, so
    // we use the top-level reader.
    return fieldName.hashCode() + context.docBase + (int)top.getVersion();
}

此外,似乎还有其他与此功能相关的代码,通过接受 int 给定文档的表示:

public int compareBottom(int doc) {
    return bottomVal - hash(doc+seed);
}

我们知道solr将确保所有文档最终在副本/碎片之间同步;然而,即使两个文档在碎片/副本/示例之间可能是相同的,但它们是否具有唯一的时间戳,因此 int 文档的表示形式在碎片/副本/示例之间会有所不同?
根据我的经验,即使在修改 getSeed() 详情如下:

private static int getSeed(String fieldName, LeafReaderContext context) {
    final DirectoryReader top = (DirectoryReader) ReaderUtil.getTopLevelContext(context).reader();
    return fieldName.hashCode();
}

最终的问题是:如果每个文档在碎片/副本/示例之间都有不同的时间戳,那么每个示例是否会返回不同的排序顺序,从而导致 random_1234 在多示例solrcloud设置中?
我在solrcloud设置中有3个示例,一个碎片和两个副本。solr的每个示例返回一个不同的排序顺序,即使文档是相同的,即使在按照上述自定义代码之后也是如此。我能看到的唯一不同是 timestamp 领域
在任何人评论这不是问题之前,因为排序顺序无论如何都应该是随机的,所以即使排序顺序在不同示例之间不同,也不会是问题,答案是否定的。在某些情况下,随机排序顺序应该在示例之间完全一致(除了同步仍在进行的短期之外)。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题