我们在使用 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 子句!
您创建的索引是部分索引(即索引有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