Search API中getNumberFound()的值不一致

时间:2013-12-31 18:23:27

标签: google-app-engine full-text-search

我有一个包含42个文档的全文搜索索引,如下面的屏幕截图所示:

Documents list from AppEngine admin panel

当我查询索引为“”时,它正确地返回所有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());

以下是日志输出的屏幕截图: log

所以我正在做的事情有问题,或者它是Search API中的一个错误,因为奇怪的是问题只发生在生产服务器而不是本地服务器。

2 个答案:

答案 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)

令人惊讶的是,这是按预期工作的(正如蒂姆所说)。

https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/search/QueryOptions.Builder#setNumberFoundAccuracy(int)

在默认状态下,数据存储区会扫描最小数据集以完成请求。数据库通过将ID范围与匹配键的估计值相乘来提供匹配结果的粗略估计(在查询期间找到匹配/ #ids的#keys)。

对于小型数据集,请将准确度值设置得更高(500或1000)并将其称为一天。您还可以通过确保密钥ID均匀分布并通过每次调用获取更高限制来改进估算(尽管如果您不需要数据,只需使用精度参数)。

这可能不适用于此,但这是大型数据集的一般解决方法: 使用num_accuracy == 1000.当查询返回估计值<1000时,您可以信任。当查询返回大于1000的估计值时,请使用第二个查询执行您自己的估算: 在数据中包含一个额外的数字字段,这是一个离散概率事件的值(例如,某些随机数据的散列中的#0)。当您从第一个查询中获得较大的估计值时,请使用附加约束(例如AND ZERO_COUNT == y)重复查询,其中根据第一个查询的估计值选择y以匹配&lt; 1000个实体,从而生成第二个查询的精确计数,您可以准确地推断。由于您不需要此数据的结果,因此您可以将限制设置为1&amp; num_accuracy == 1000。