我的SOLR集合中的临时重复文档存在问题,导致我的用户排名系统不正确。
我使用的是SOLR版本4.8.1,因此它是最新版本之一。我正在使用XML来更新SOLR集合,如此SOLR Documentation中所述:
<add overwrite="true" commitWithin="#COMMIT_WITHIN.GLOBAL_VALUE#">
<doc>
<field name="END_USER_ID">#END_USER_ID#</field>
<field name="TARGET_REGION_ID">#TARGET_REGION_ID#</field>
<field name="POPULARITY_RANK">#POPULARITY_RANK#</field>
<field name="VISIBILITY_SCORE">#VISIBILITY_SCORE#</field>
<field name="POPULARITY_VISIBILITY_SCORES_ID">#POPULARITY_VISIBILITY_SCORES_ID#</field>
<cfif #POP_VIS_SCORES_LAST_MODIFIED_DATETIME# NEQ "">
<field name="POPULARITY_VISIBILITY_SCORES_DATE_MODIFIED">#POP_VIS_SCORES_LAST_MODIFIED_DATETIME#</field>
</cfif>
</doc>
</add>
&#13;
从上面的代码中可以看出,我使用overwrite参数(让更新的文档用相同的uniqueKey替换以前添加的文档)和commitWithin参数(在特定时间段内添加文档)。在这种情况下,uniqueKey应为END_USER_ID,时间段应为15秒;我已经检查过以确保在相应的schema.xml文件中定义了uniqueKey,并且对于END_USER_ID,multiValued设置为false。
所以在我的排名页面上,有几次调用我们当地的SOLR服务器。例如:
http://localhost:8983/solr/pop_vis_scores/select/?q=TARGET_REGION_ID:50%20AND%20-POPULARITY_RANK:0&version=4.8&start=0&rows=1&indent=off&stats=true&stats.field=POPULARITY_RANK&sort=POPULARITY_RANK%20ASC&fl=[docid],END_USER_ID,POPULARITY_RANK&timeAllowed=8000
&#13;
根据我的观察,当commitWithin设置为15000毫秒时,更新的SOLR文档立即可用,但存在反映旧数据的重复SOLR文档。当commitWithin设置为500毫秒时,似乎问题不存在。话虽如此,我认为问题仍然存在,但用户无法快速行动以查看重复的文档。当我有成千上万的用户玩这个游戏时,我认为这个问题实际上可能仍然存在于更大的范围内。另外,当游戏的玩家基数增加时,将commitWithin设置回15秒会很好。
之前有人遇到过类似的问题,如果有的话,你会怎样解决它?有人有什么建议吗?提前谢谢!
答案 0 :(得分:0)
我假设当一个SOLR文档在给定的15秒时间窗口内被添加到集合中时,旧文档将在新文档插入集合的同时被删除。看来这个假设是不正确的。我能够从查询中排除用户ID,以便在排名时获得更准确的统计值。对于遇到类似情况的人,我建议不要假设SOLR文档同时被删除和更新。