我们知道,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
领域
在任何人评论这不是问题之前,因为排序顺序无论如何都应该是随机的,所以即使排序顺序在不同示例之间不同,也不会是问题,答案是否定的。在某些情况下,随机排序顺序应该在示例之间完全一致(除了同步仍在进行的短期之外)。
暂无答案!
目前还没有任何答案,快来回答吧!