Couchbase没有可用的索引

时间:2019-08-08 06:22:40

标签: 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')

并出现以下错误:

  

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

我们已经证实索引很明显是在线的。唯一需要注意的是,此存储桶目前实际上不包含任何文档,但是在这种情况下,我们不希望出现此错误,只是什么也不会返回。

有什么想法吗?

编辑:

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

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

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

2 个答案:

答案 0 :(得分:1)

您创建的索引是部分索引(即,索引具有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中为查询设计索引

答案 1 :(得分:0)

我尝试使用名为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数组。

现在,我真的不知道从哪里去,但似乎使用除主索引之外的任何其他方法查询空存储桶都会返回此错误。