在代码中创建 Couchbase 视图:首先查询 returns 0 行,索引在后台构建

Creating Couchbase views in code: First query returns 0 rows, index builds in background

我正在使用 Couchbase Java API 2.1.2 在代码中创建一个视图,如下所示:

DefaultView view = DefaultView.create(viewName, jsMapFunctionAsString);
List<View> views = new ArrayList<>();
views.add(view);
DesignDocument doc = DesignDocument.create(name, views);
bucket.bucketManager().insertDesignDocument(doc);

插入文档后直接调用ViewResult result = bucket.query(ViewQuery.from(name, viewName))viewResult.success()总是return为真,但是迭代器rows()iterator都return 0 行(肯定有结果。当我在 Web 界面中执行视图时,它 return 是正确的值)。

几个小时后我发现的解决方法是调用 query 两次,中间有足够的等待时间,例如

ViewResult result = bucket.query(ViewQuery.from(name, viewName));
Thread.sleep(10000);
result = bucket.query(ViewQuery.from(name, viewName));

第二次调用将 return 正确的结果。

似乎 Couchbase 必须先为查询构建索引,但 return 直接构建索引,甚至在构建索引之前。
等待 10 秒当然不是最优的,也许以后创建索引会花费更多时间。

所以我的问题是,我怎样才能确保我只等到索引已经建立?
这是 API 中的错误吗?

您可以使用 stale 方法并在 ViewQuery 中将其设置为 false,这将强制等待索引完成后再返回结果。