如何在Couchbase中为嵌入对象创建索引?

时间:2018-03-28 11:14:41

标签: indexing couchbase n1ql

我有100万份文件。

我想运行此查询:

SELECT * FROM bucket WHERE type = 'toy' AND material = 'plastic' AND color = 'red' AND weight = '200gr' AND height = '5cm' AND width = '15cm'

"属性"是嵌入在文档中的对象。

示例:

  

"输入":"玩具",
"其他关键":"其他值",&& #34;其他关键":"其他   价值",
"属性":{
"材料":"塑料",


    "颜色":"红色",
"重量":" 200gr",&"身高&# 34;:" 5cm",
    "宽度":" 15cm"
}"其他键":"其他值",
"其他关键":   "其他价值"

如何在Query Workbench中创建索引以获得最快的响应时间?

2 个答案:

答案 0 :(得分:1)

假设您有以下文档:

{
    "type": "toy",
        "attributes": {
        "material": "plastic",
        "color": "red",
        "weight": "200gr",
        "height": "5cm",
        "width": "15cm"
    }
}

您的查询就像:

SELECT * FROM `test` t WHERE t.type = 'toy' AND t.attributes.material = 'plastic' AND t.attributes.color = 'red'AND t.attributes.weight = '200gr' AND t.attributes.height = '5cm' AND t.attributes.width = '15cm'

它的索引与此类似:

create index toysIndex on `test`(type, attributes.material, attributes.color, attributes.weight, attributes.height, attributes.width  ) USING GSI; 

enter image description here

答案 1 :(得分:0)

deniswsrosa的建议肯定会起作用,但是您可以通过将类型规范移到索引的WHERE子句中对其进行一些改进。这样,这些字段的索引将仅包含“玩具”类型的对象;其他类型的对象将不会被索引。这将使索引稍微小一些,因为它更具体。在使用索引时仍会考虑type =“ toy”子句。

赞:

create index toysIndex on test(attributes.material, attributes.color,
attributes.weight, attributes.height, attributes.width  ) 
where type = 'toy'; 

请注意,您不需要在“测试”后面打勾。另外,GSI索引是默认索引。