Ibm cloud 为什么';这不是Cloudant/couchdb$regex查询工作吗?

Ibm cloud 为什么';这不是Cloudant/couchdb$regex查询工作吗?,ibm-cloud,cloudant,Ibm Cloud,Cloudant,我正在尝试从数据库中提取(并删除)所有没有包含“box”一词的URL的记录。这是我正在使用的查询: { "selector": { "$not": { "url": { "$regex": ".*box.*" } } }, "limit": 50 } 此查询不返回任何记录。但是如果我删除$not,我会得到所有在url中有“box”一词的记录,但这与我想要的正好相反。为什么添加$not时没有结果

我正在尝试从数据库中提取(并删除)所有没有包含“box”一词的URL的记录。这是我正在使用的查询:

{
   "selector": {
      "$not": {
         "url": {
            "$regex": ".*box.*"
         }
      }
   },
   "limit": 50
}
此查询不返回任何记录。但是如果我删除$not,我会得到所有在url中有“box”一词的记录,但这与我想要的正好相反。为什么添加$not时没有结果

我曾尝试向查询添加一个简单的基,如“_id”:{“$gte”:0},但没有帮助。

来自:

通过组合,可以创建更复杂的选择器表达式 接线员。但是,对于json类型的Cloudant NoSQL DB查询索引, 不能使用“组合”或“数组逻辑”运算符,例如 $regex作为查询的基础

$not
是一个查询,因此不能作为查询的基础

我能够做到以下几点:

索引

{
    "index": {
        "fields": ["url"]
    },
    "name" : "url-json-index",
    "type" : "json"
}
查询

{
   "selector": {
      "url": {
         "$not": {
            "$regex": ".*box.*"
         }
      }
   },
   "limit": 50,
   "use_index": "url-json-index"
}
如果您仍然看到问题,能否提供
\uu/explain
的输出以及您已有的索引。

无结果问题是由于最近修复的文本索引中的错误造成的。但是,无论是
$not
还是
$regex
操作员都无法利用全局索引,因此总是会导致完整的数据库或索引扫描

优化此查询的方法是使用。部分索引在索引时而不是在查询时过滤文档,从而在数据库的子集上创建索引。然后需要告诉
\u find
端点显式使用部分索引。例如,创建一个索引,其中仅包含与正则表达式不匹配的文档:

POST /<db>/_index
{
  "index": {
    "partial_filter_selector": {
      "url": {
         "$not": {
            "$regex": ".*box.*"
         }
      }
    },
    "fields": ["type"]
  },
  "ddoc" : "url-not-box",
  "type" : "json"
}
您可以在Cloudant UI中看到为完成查询而扫描了多少文档-执行统计信息显示在查询文本区域下方的弹出窗口中


关于部分索引的内容也会对您有所帮助。

谢谢您的快速回复。然而,我仍然无法让它工作。我已经有了url字段的JSON索引,还有一个全文索引和另一个字段的JSON索引。以下是explain(由于注释大小的限制,在多个注释中)的输出:{“dbname”:“eeed3510-e6c7-4d57-85e4-fa34a53ba0ab-bluemix/david_test_自定义_答案”,“索引”:{“ddoc”:“U设计/32372935e14bed00cc6db4fc9efca0f1537d34a8”,“名称”:“32372935e14bed00cc6db4fc9efca0f1537d34a8”,“类型”:“文本”,“def”:{“默认分析仪”:“关键字”,“默认值字段”:{},“选择器”:{},“字段”:[],“索引数组长度”:true}},…“选择器”:{“url”:{“$not”:{“$regex”:“*box..*}}}}”,选项:{“使用索引”:[],“书签”:[],“限制”:50,“跳过”:0,“排序”:{},“字段”:“所有字段”,“r”:[49],“冲突”:false,“stale”:false,“update”:true,“stable”:false,“execution_stats”:false},“limit”:50,“skip”:0,“fields”:“all_fields”,“query:”(($fieldnames:url_3a*)或($fieldnames:url.*))而非($fieldnames:url_3astring)),“sort:“relevance”}很抱歉,我不精通这一点,也不知道如何阅读解释输出。@DavidPowell,在解释中,查询使用的是索引
“name”:“32372935e14bed00cc6db4fc9efca0f1537d34a8”
,这是一个
文本
索引(可能不是您不想要的索引)。您可以尝试让它使用json索引或其他特定索引,包括
“use_index”:“
请参见上面我编辑的示例。您可以在此处了解有关解释计划以及如何选择索引的更多信息:
{
   "selector": {
      "url": {
         "$not": {
            "$regex": ".*box.*"
         }
      }
   },
   "limit": 50,
   "use_index": "url-not-box"
}