Couchbase 无可用索引

Couchbase No Index Available

我们在使用 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 目前实际上不包含任何文档,但我们不希望在这种情况下出现此错误,根本就没有什么可以 returned.

有什么想法吗?

编辑:

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

CREATE INDEX `AppUser_SubjectId4` ON `Portal`(`SubjectId`)

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

我尝试使用名为 test 的空存储桶成功重现您的问题。 我使用以下查询创建了相同的索引:

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

并检查索引是否在线。然后我尝试了您的查询,结果出现了完全相同的错误。

[
  {
    "code": 4000,
    "msg": "No index available on keyspace test that matches your query. Use CREATE INDEX or CREATE PRIMARY INDEX to create an index, or check that your expected index is online.",
    "query_from_user": "SELECT RAW `Extent1` FROM `test` as `Extent1` USE INDEX (`AppUser_SubjectId3` USING GSI) WHERE (`Extent1`.`SubjectId` = 'c8ea08231c3a985a06342355b87d6e2d6290a985d5c3592e5b8e5e5f14608a08')"
  }
]

所以我检查了存储桶的架构:

INFER `test`

这 return 编辑了以下错误:

[
  {
    "code": 0,
    "msg": "Keyspace test has no documents, schema inference not possible"
  }
]

但是我还创建了一个主索引,查询它只会 return 一个空的 results 数组。

现在我真的不知道该从哪里开始,但使用除主索引以外的任何其他方式查询空桶似乎确实会 return 这个错误。

您创建的索引是部分索引(即索引有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