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

时间:2019-01-01 17:57:23

标签: couchbase n1ql

通过我进行的测试,看来这些都是特别大的文档(〜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'

它返回文档,我在列表或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个索引节点)。


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

2 个答案:

答案 0 :(得分:2)

检查indexer.log并查看是否由于索引键大小限制而跳过了特定的索引。如果索引未建立索引,查询将找不到该文档。如果您已经知道文档密钥和查询未被涵盖,那么最好的选择是指定USE KEYS并删除META()。id谓词,这样可以节省时间。

由于您的文档很大并且尝试进行ARRAY索引编制,因此可能已跳过。如果您知道文档密钥,则无需数组索引就可以直接使用USE KEYS获取文档并应用谓词。如果由于尺寸限制而跳过了文档,请查看此帖子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喜欢“ 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/

答案 1 :(得分:0)

好的,我只是在这里进行最简单的猜测,但是在此查询中

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