为什么这个 Composite Secondary couchbase Index 只匹配创建查询中的第一个字段
Why this Composite Secondary couchbase Index matches only for the first field in the creation query
我使用以下查询为我的订单桶创建了一个复合索引:
CREATE INDEX idx_customer ON `order` (
buyer.contact.firstName,
buyer.contact.lastName,
ALL DISTINCT ARRAY aoc.`value` FOR aoc IN buyer.contact.communicationChannel
WHEN aoc.`communicationChannelCode`= "EMAIL" END)
WHERE _class = "com.lbk.entities.OrderEntity"
当我搜索 buyer.contact.firstName 时,查询与索引匹配,但搜索 buyer.contact.lastName 失败。
基本上它匹配查询中的第一个字段。
这是失败字段 (buyer.contact.lastName) 的解释结果:
{
"plan": {
"#operator": "Sequence",
"~children": [
{
"#operator": "PrimaryScan3",
"index": "#primary",
"index_projection": {
"primary_key": true
},
"keyspace": "order",
"namespace": "default",
"using": "gsi"
},
{
"#operator": "Fetch",
"keyspace": "order",
"namespace": "default"
},
{
"#operator": "Parallel",
"~child": {
"#operator": "Sequence",
"~children": [
{
"#operator": "Filter",
"condition": "(((((`order`.`buyer`).`contact`).`lastName`) = \"jj\") and ((`order`.`_class`) = \"com.lbk.entities.OrderEntity\"))"
},
{
"#operator": "InitialProject",
"result_terms": [
{
"expr": "(((`order`.`buyer`).`contact`).`lastName`)"
}
]
},
{
"#operator": "FinalProject"
}
]
}
}
]
},
"text": "SELECT buyer.contact.lastName FROM `order` where buyer.contact.lastName = 'jj'\nAND (`_class` = \"com.lbk.entities.OrderEntity\")"
}
企业版 5.5.1 build 3511
要使用索引,查询谓词必须有前导索引键作为谓词。
Couchbase 存储桶可以包含任何类型的文档,并且没有架构。当文档中的前导索引键缺失时,索引器将不会编制索引。如果前导索引键上没有谓词,查询也必须包含 MISSING 值,因此索引将不符合该查询的条件,也不会被使用。
在您的情况下,如果可以,请将以下内容之一添加到查询谓词中。
1) AND buyer.contact.firstName IS NOT MISSING
2) AND buyer.contact.firstName IS NOT NULL
3) AND buyer.contact.firstName IS VALUED
在https://blog.couchbase.com/n1ql-practical-guide-second-edition/
结帐"Designing Index For Query In Couchbase N1QL"
我使用以下查询为我的订单桶创建了一个复合索引:
CREATE INDEX idx_customer ON `order` (
buyer.contact.firstName,
buyer.contact.lastName,
ALL DISTINCT ARRAY aoc.`value` FOR aoc IN buyer.contact.communicationChannel
WHEN aoc.`communicationChannelCode`= "EMAIL" END)
WHERE _class = "com.lbk.entities.OrderEntity"
当我搜索 buyer.contact.firstName 时,查询与索引匹配,但搜索 buyer.contact.lastName 失败。 基本上它匹配查询中的第一个字段。
这是失败字段 (buyer.contact.lastName) 的解释结果:
{
"plan": {
"#operator": "Sequence",
"~children": [
{
"#operator": "PrimaryScan3",
"index": "#primary",
"index_projection": {
"primary_key": true
},
"keyspace": "order",
"namespace": "default",
"using": "gsi"
},
{
"#operator": "Fetch",
"keyspace": "order",
"namespace": "default"
},
{
"#operator": "Parallel",
"~child": {
"#operator": "Sequence",
"~children": [
{
"#operator": "Filter",
"condition": "(((((`order`.`buyer`).`contact`).`lastName`) = \"jj\") and ((`order`.`_class`) = \"com.lbk.entities.OrderEntity\"))"
},
{
"#operator": "InitialProject",
"result_terms": [
{
"expr": "(((`order`.`buyer`).`contact`).`lastName`)"
}
]
},
{
"#operator": "FinalProject"
}
]
}
}
]
},
"text": "SELECT buyer.contact.lastName FROM `order` where buyer.contact.lastName = 'jj'\nAND (`_class` = \"com.lbk.entities.OrderEntity\")"
}
企业版 5.5.1 build 3511
要使用索引,查询谓词必须有前导索引键作为谓词。 Couchbase 存储桶可以包含任何类型的文档,并且没有架构。当文档中的前导索引键缺失时,索引器将不会编制索引。如果前导索引键上没有谓词,查询也必须包含 MISSING 值,因此索引将不符合该查询的条件,也不会被使用。
在您的情况下,如果可以,请将以下内容之一添加到查询谓词中。
1) AND buyer.contact.firstName IS NOT MISSING
2) AND buyer.contact.firstName IS NOT NULL
3) AND buyer.contact.firstName IS VALUED
在https://blog.couchbase.com/n1ql-practical-guide-second-edition/
结帐"Designing Index For Query In Couchbase N1QL"