CouchDB Mango索引““不包含此查询”“得有效索引,即使手动指定也是如此

thtygnil  于 2022-12-09  发布在  CouchDB
关注(0)|答案(1)|浏览(199)

我试图通过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执行完全扫描。

yruzcnhs

yruzcnhs1#

未使用该索引,因为查询计划器未按预期识别$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"
    }

返回预期的结果,并生成“explain”以确认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的文档
从技术上讲,我们不需要在查询选择器中包含“status”字段上的过滤器[例如,$doctype here]-部分索引确保了这一点始终为真-但包含它会使选择器的意图更清晰,并将更容易利用查询规划的未来改进(例如,自动选择部分索引)。
尽管如此,我不会选择索引值为常数的字段。

相关问题