Couchbase没有可用的索引

Couchbase没有可用的索引,couchbase,n1ql,Couchbase,N1ql,我们在couchbase N1QL查询中遇到问题 我们有一个定义如下的索引: 在`Portal`(`SubjectId`)上创建索引`AppUser\u SubjectId`,其中(`AppUser%`)类似于`AppUser%`(meta(self)。`id`) 然后,我们尝试运行以下查询: 选择原始的'Extent1` 从“门户”改为“扩展1” 使用索引(`AppUser\u SubjectId3`使用GSI) 其中(`Extent1`.`subject`='C8EA08231C3A985

我们在couchbase N1QL查询中遇到问题

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

在`Portal`(`SubjectId`)上创建索引`AppUser\u SubjectId`,其中(`AppUser%`)类似于`AppUser%`(meta(self)。`id`)
然后,我们尝试运行以下查询:

选择原始的'Extent1`
从“门户”改为“扩展1”
使用索引(`AppUser\u SubjectId3`使用GSI)
其中(`Extent1`.`subject`='C8EA08231C3A985A06342355B87D6E2D6290A985D5C3592E5B8E5F14608A08')
并获取以下错误:

keyspace Portal上没有与您的查询匹配的索引。
使用创建索引或创建主索引来创建索引,
或者检查您的预期索引是否联机

我们已经证实了一个明显的事实,即该指数是在线的。唯一值得注意的是,Bucket目前实际上并不包含任何文档,但我们不希望在本例中出现此错误,只希望不返回任何内容

有什么想法吗

编辑:

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

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

唯一的问题是WHERE子句是必需的

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

在'test'('SubjectId')上创建索引'AppUser\u SubjectId3',其中((meta(self)。'id`)类似于'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')"
  }
]
因此,我检查了bucket的模式:

推断测试` 这返回了以下错误:

[
  {
    "code": 0,
    "msg": "Keyspace test has no documents, schema inference not possible"
  }
]
然而,我也创建了一个主索引,查询它只会返回一个空的
results
数组


现在我真的不知道该怎么办,但似乎使用主索引以外的任何东西查询空存储桶都会返回此错误。

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

感谢您的帮助。我用我做过的一些附加测试编辑了我的问题,这些测试似乎排除了空桶问题。这不是我想要的答案,因为它实际上并不能解决我正在研究的整个问题,但它确实解决了我在这里遇到的这个特殊问题。谢谢如果您需要更多帮助,请在此处或couchbase论坛发布