使用特定索引时 couchbase 不返回某些文档

couchbase not returning some documents when using specific index

根据我所做的测试,这些文档似乎特别大(~2mb)并且当查询使用特定索引(在我的例子中是数组索引)时。
当文档较小时似乎工作正常。
这发生在 Couchbase 仪表板、cbq 或我正在使用的 scala SDK 中。
我正在使用 Couchbase 4.6.0 内存优化索引


我有这些与此查询相关的索引:

CREATE INDEX `cache_partial_specific`
ON `content`(`docType`,`entityType`,`entityId`) 
WHERE (`docType` = "feedCachePartial") WITH { "defer_build"=true }  

CREATE INDEX `feed_cache_partial_meta`
ON `content`(`meta().id`)
WHERE (`docType` = `feedCachePartial`)  

CREATE INDEX `cache_partial_index`
ON `content`((distinct (array (`url`.`id`) for `url` in `urls` end)))
WHERE (`docType` = "feedCachePartial") WITH { "defer_build"=true }

最后一个惹是生非


问题:

例如当运行
SELECT * FROM content WHERE meta().id = 'cached:topic:297:grp:all'

SELECT * FROM content WHERE docType='feedCachePartial' AND entityId=297 and entityType='topic'

它 returns 文件,我在列表或 url 中看到 url 13319。

但是当运行

SELECT * FROM content
WHERE docType='feedCachePartial'
AND ANY url IN urls SATISFIES url.id = 13119 END

或条件 ANY url IN urls SATISFIES url.id = 13119

的任何变体

文档cached:topic:297:grp:all没有返回。


max_indexer_doc_size 设置为 20 MB,所以我相信这不是问题所在(使用其他索引时无论哪种方式都会返回)。

查看查询日志时,我看到我正在使用的这个特定索引有 1 个副本(我在这个集群上总共有 3 个索引节点)。


我会调查此索引并查看哪些文档根据索引调整大小,但我不知道该怎么做。

好的,我在这里只做我最简单的猜测,但在这个查询中

SELECT * FROM content
where docType='feedCachePartial'
and meta().id = 'cached:topic:297:grp:all'
AND entityId=297
and entityType='topic'
AND ANY url IN c.urls SATISFIES url.id = 13119 END

"c.urls"中的"c"是否正确?或者第一行应该说 SELECT * FROM content c?

检查您的 indexer.log 并查看特定索引是否由于索引键大小而跳过您的文档键 limitations.If 索引未编入索引查询将找不到该文档。如果您已经知道文档键并且未涵盖查询,则最佳选择是指定 USE KEYS 并删除 META().id 谓词,这样可以节省时间。

由于您的文档很大并且尝试进行 ARRAY 索引,它可能已被跳过。如果您知道文档键,则无需数组索引直接使用 USE KEYS 获取文档并应用谓词。如果由于大小限制而跳过文档,请检查此 post https://forums.couchbase.com/t/how-to-read-max-array-seckey-size-setting-version-4-5-1-2844-community-edition-build-2844/16374

SELECT * FROM content USE KEYS "cached:topic:297:grp:all" WHERE .... 

除非您在 META().id 上进行搜索(例如:META().id LIKE "xyz%"),否则 feed_cache_partial_meta 索引可能没有用。您可以使用 USE KEYS。

如果文档很小,您可以像这样组合其他索引,看看它是否有效并避免 Intersectscans。

CREATE INDEX `cache_partial_index`
ON `content`(`docType`,`entityType`,`entityId`, DISTINCT ARRAY url.id FOR url IN urls END)
WHERE (`docType` = "feedCachePartial") WITH { "defer_build"=true };

以下博客有有用的信息

https://blog.couchbase.com/create-right-index-get-right-performance/ https://blog.couchbase.com/n1ql-practical-guide-second-edition/