我有一个包含42个文档的全文搜索索引,如下面的屏幕截图所示:
当我查询索引为“”时,它正确地返回所有42个文档(好),但是当我在查询中使用limit和offset选项时,返回的值为找到的匹配总数(results.getNumberFound( ))不时变化。它为不同的偏移量提供了不同的值!简而言之,使用不同的偏移值进行相同的查询会为results.getNumberFound()函数提供不同的值!
注意:部署应用程序后,在生产服务器中只发生 。在本地服务器的一切 完美地工作(即对于相同的查询,无论偏移选项值如何,找到的总命中数都是相同的。)
Query query = Query.newBuilder()
.setOptions(QueryOptions.newBuilder()
.setLimit(limit)
.setOffset(offset).build())
.build(searchPhrase);
Results<ScoredDocument> results = INDEX.search(query);
LOG.warning( "Phrase:'" + searchPhrase +
"' limit:" + limit +
" offset:" + offset +
" num:" + results.getNumberFound());
以下是日志输出的屏幕截图:
所以我正在做的事情有问题,或者它是Search API中的一个错误,因为奇怪的是问题只发生在生产服务器而不是本地服务器。
答案 0 :(得分:1)
python docs说
number_found
返回与查询匹配的近似文档数。 QueryOptions定义搜索结果的后处理。如果QueryOptions.number_found_accuracy参数设置为100,则number_found <= 100是准确的。
Java中存在类似的api组件。从您的代码看,您似乎没有设置准确性。请参阅java QueryOptions https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/search/QueryOptions
话虽如此,我已经看到很多关于发现结果数量缺乏准确性的问题/讨论。
答案 1 :(得分:1)
令人惊讶的是,这是按预期工作的(正如蒂姆所说)。
在默认状态下,数据存储区会扫描最小数据集以完成请求。数据库通过将ID范围与匹配键的估计值相乘来提供匹配结果的粗略估计(在查询期间找到匹配/ #ids的#keys)。
对于小型数据集,请将准确度值设置得更高(500或1000)并将其称为一天。您还可以通过确保密钥ID均匀分布并通过每次调用获取更高限制来改进估算(尽管如果您不需要数据,只需使用精度参数)。
这可能不适用于此,但这是大型数据集的一般解决方法: 使用num_accuracy == 1000.当查询返回估计值<1000时,您可以信任。当查询返回大于1000的估计值时,请使用第二个查询执行您自己的估算: 在数据中包含一个额外的数字字段,这是一个离散概率事件的值(例如,某些随机数据的散列中的#0)。当您从第一个查询中获得较大的估计值时,请使用附加约束(例如AND ZERO_COUNT == y)重复查询,其中根据第一个查询的估计值选择y以匹配&lt; 1000个实体,从而生成第二个查询的精确计数,您可以准确地推断。由于您不需要此数据的结果,因此您可以将限制设置为1&amp; num_accuracy == 1000。