首页 > 解决方案 > 即使手动指定芒果索引“不包含此查询的有效索引”

问题描述

我正在尝试通过 Mango 有效地查询数据(因为这似乎是我的要求的唯一选择Searching for sub-objects with a date range contains the queried date value),但我什至无法获得一个非常简单的索引/查询对工作:虽然我为查询手动指定了我的索引,但我被告知我的索引“未使用,因为它不包含此查询的有效索引。找不到匹配的索引,创建一个索引以优化查询时间。”

(我在 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 执行完整扫描。

标签: couchdbcouchdb-mango

解决方案


未使用索引,因为$doctype查询计划程序未按预期识别该字段。

将设计文档中的字段声明从更改为$doctype解决此问题。\\$doctype

{
   "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"
    }

返回预期的结果,并产生一个“解释”,确认job-openings-doctype-index被查询:

{
 "dbname": "stack",
 "index": {
  "ddoc": "_design/job-openings-doctype-index",
  "name": "7f5c5cea5acd90f11fffca3e3355b6a03677ad53",
  "type": "json",
  "def": {
   "fields": [
    {
     "tenant": "asc"
    },
    {
     "\\$doctype": "asc"
    }
   ],
   "partial_filter_selector": {
    "\\$doctype": {
     "$eq": "JobOpening"
    }
   }
  }
 },
// etc etc etc

这种变化是否直观尚不清楚,但它是一致的 - 并且可能不希望显示带有“特殊”字符的前导字段名称。

关于过滤字段的索引,根据有关 partial_filter_selector 的文档

从技术上讲,我们不需要在查询选择器的“状态”[例如 $doctype here] 字段中包含过滤器 - 部分索引确保这始终是正确的 - 但包含它会使选择器的意图更清晰,并使更容易利用查询计划的未来改进(例如部分索引的自动选择)。

尽管如此,我不会选择索引值恒定的字段。


推荐阅读