使用特定索引时 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/
根据我所做的测试,这些文档似乎特别大(~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/