我试图通过Mango高效地查询数据(因为这似乎是唯一的选择,因为我的要求是搜索包含查询日期值的日期范围的子对象),但我甚至不能让一个非常简单的索引/查询对工作:但我被告知我的索引“未被使用,因为它不包含此查询的有效索引。找不到匹配的索引,请创建索引以优化查询时间。”
(我通过CouchDB v.3.0.0上的Fauxton完成所有这些工作)
假设我的文档如下所示:
{
"tenant": "TNNT_a",
"$doctype": "JobOpening",
// a bunch of other fields
}
所有$doctype
为“JobOpening”的文档都保证具有tenant
属性。我希望执行的搜索将只针对$doctype
为“JobOpening”的文档,并且在查询时将始终提供tenant
选择器。
下面是我配置的测试索引:
{
"index": {
"fields": [
"tenant",
"$doctype"
],
"partial_filter_selector": {
"\\$doctype": {
"$eq": "JobOpening"
}
}
},
"ddoc": "job-openings-doctype-index",
"type": "json"
}
下面是查询
{
"selector": {
"tenant": "TNNT_a",
"\\$doctype": "JobOpening"
},
"use_index": "job-openings-doctype-index"
}
为什么查询不使用索引?
我已经尝试过不使用部分索引,并且我认为$doctype
转义在必要的地方正确地完成了,但是似乎没有什么可以阻止CouchDB执行完全扫描。
1条答案
按热度按时间yruzcnhs1#
未使用该索引,因为查询计划器未按预期识别
$doctype
字段。在设计文档中将字段声明从
$doctype
更改为\\$doctype
可解决此问题。在这个小的重构之后,查询
返回预期的结果,并生成“explain”以确认
job-openings-doctype-index
已被查询:这种变化是否是直观的还不清楚,但它是一致的-也许揭示了一个“特殊”字符的前导字段名称可能是不可取的。
关于筛选字段的索引,根据有关partial_filter_selector的文档
从技术上讲,我们不需要在查询选择器中包含“status”字段上的过滤器[例如,$doctype here]-部分索引确保了这一点始终为真-但包含它会使选择器的意图更清晰,并将更容易利用查询规划的未来改进(例如,自动选择部分索引)。
尽管如此,我不会选择索引值为常数的字段。