Couchbase 没有可用的索引

Posted

技术标签:

【中文标题】Couchbase 没有可用的索引【英文标题】:Couchbase No Index Available 【发布时间】:2019-08-08 06:22:40 【问题描述】:

我们在使用 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')

并得到以下错误:

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

我们已经确认该索引已在线。唯一值得注意的是 Bucket 目前实际上不包含任何文档,但我们不会期望在这种情况下出现此错误,根本不会返回任何内容。

有什么想法吗?

编辑:

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

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

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

【问题讨论】:

【参考方案1】:

您创建的索引是部分索引(即索引有 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 论坛发帖【参考方案2】:

我尝试使用名为 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`

这返回了以下错误:

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

不过,我还创建了一个主索引,查询它只会返回一个空的 results 数组。

现在我真的不知道从哪里开始,但似乎使用除主索引以外的任何其他内容查询空存储桶会返回此错误。

【讨论】:

感谢您的帮助。我已经通过一些额外的测试编辑了我的问题,这些测试似乎排除了空桶问题。

以上是关于Couchbase 没有可用的索引的主要内容,如果未能解决你的问题,请参考以下文章

NoSQL文档型数据库Couchbase的生产部署最佳实践

Couchbase 索引

Couchbase:查找二进制文档的索引

Spring & Couchbase - 如何通过代码创建索引

ElasticSearch或Couchbase或其他东西

10 亿份文档的 Couchbase N1QL 索引