Couchbase 无可用索引

Gre*_*mps 5 couchbase sql++

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

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

CREATE INDEX `AppUser_SubjectId3` ON `Portal`(`SubjectId`) WHERE ((meta(self).`id`) like `AppUser%`)
Run Code Online (Sandbox Code Playgroud)

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

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

并得到以下错误:

键空间门户上没有与您的查询匹配的索引。
使用 CREATE INDEX 或 CREATE PRIMARY INDEX 创建索引,
或检查您的预期索引是否在线。

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

有任何想法吗?

编辑:

我创建了另一个没有 WHERE 子句的索引,它不再返回错误。

CREATE INDEX `AppUser_SubjectId4` ON `Portal`(`SubjectId`)
Run Code Online (Sandbox Code Playgroud)

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

vsr*_*vsr 2

您创建的索引是部分索引(即索引有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%";
Run Code Online (Sandbox Code Playgroud)

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