Couchbase 无可用索引

标签 couchbase n1ql

我们在使用 couchbase N1QL 查询时遇到问题。

我们有一个索引定义如下:

CREATE INDEX `AppUser_SubjectId3` ON `Portal`(`SubjectId`) WHERE ((meta(self).`id`) like `AppUser%`)

然后我们尝试运行以下查询:

SELECT RAW `Extent1` 
FROM `Portal` as `Extent1` 
USE INDEX (`AppUser_SubjectId3` USING GSI) 
WHERE (`Extent1`.`SubjectId` = 'c8ea08231c3a985a06342355b87d6e2d6290a985d5c3592e5b8e5e5f14608a08')

并得到以下错误:

No index available on keyspace Portal that matches your query.
Use CREATE INDEX or CREATE PRIMARY INDEX to create an index,
or check that your expected index is online.



我们已经确认了明显的索引在线。唯一值得注意的是 Bucket 目前实际上并不包含任何文档,但我们不希望在这种情况下出现这个错误,只是没有返回任何内容。

有任何想法吗?

编辑:

我创建了另一个没有 WHERE 子句的索引,它不再返回错误。
CREATE INDEX `AppUser_SubjectId4` ON `Portal`(`SubjectId`)

唯一的问题是需要 WHERE 子句!

最佳答案

您创建的索引是部分索引(即索引有 WHERE 子句,只有满足 where 条件的条目)。对于使用该索引的查询,它必须符合条件(即查询 where 子句必须是索引的子集 where 子句 + 查询谓词必须具有前导索引键),否则通过选择该索引可能会导致错误结果并且查询优化器不会选择该索引.

也喜欢 AppUser%不正确它必须是单引号或双引号而不是反引号。

CREATE INDEX `AppUser_SubjectId3` ON `test`(`SubjectId`) 
WHERE meta().`id` like "AppUser%";


SELECT RAW e 
FROM `Portal` AS e 
USE INDEX (`AppUser_SubjectId3` USING GSI) 
WHERE e.`SubjectId` = 'c8ea08231c3a985a06342355b87d6e2d6290a985d5c3592e5b8e5e5f14608a08'
      AND META(e).id LIKE "AppUser%";

在 Couchbase N1QL 中设计查询索引 https://blog.couchbase.com/wp-content/uploads/2017/10/N1QL-A-Practical-Guide-2nd-Edition.pdf

关于Couchbase 无可用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57406312/

相关文章:

node.js - Couchbase 几秒后超时

nosql - 使用 Memcache API 兼容存储在删除/驱逐后保留缓存数据

docker - 自动化Docker容器的服务(couchbase)配置

沙发底座 N1QL : How to aggregate and join from the same bucket with an array of keys

Couchbase - 我什么时候应该使用 N1QL 和 Views?

php - 安装 PHP SDK Couchbase 报错

Couchbase - 获取所有文档前缀

couchbase - 如何使用函数或运算符迭代 Couchbase 中的记录

nosql - couchbase 查询返回空答案

database - Couchbase 看不到二级索引