簡體   English   中英

為什么此Cloudant / couchdb $ regex查詢不起作用?

[英]Why doesn't this Cloudant/couchdb $regex query work?

我試圖從我們的數據庫中拉(刪除)所有沒有 URL並帶有單詞“ box”的記錄。 這是我正在使用的查詢:

{
   "selector": {
      "$not": {
         "url": {
            "$regex": ".*box.*"
         }
      }
   },
   "limit": 50
}

該查詢不返回任何記錄。 但是,如果刪除$ not,我將在URL中獲得所有確實帶有單詞“ box”的記錄,但這與我想要的相反。 為什么在添加$ not時沒有結果?

我曾嘗試向查詢添加一個簡單的基礎,例如“ _id”:{“ $ gte”:0},但這無濟於事。

來自Cloudant doc

您可以通過組合運算符來創建更復雜的選擇器表達式。 但是,對於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"
}

如果仍然遇到問題,可以提供_/explain的輸出以及已建立的索引。

“無結果”問題是由於最近已修復的文本索引錯誤所致。 但是, $not$regex運算符都不能利用全局索引,因此將始終導致完整的數據庫或索引掃描。

優化此查詢的方法是使用部分索引 部分索引在建立索引時而不是在查詢時過濾文檔,從而在數據庫的子集上創建索引。 然后,您需要告訴_find端點顯式使用部分索引。 例如,創建一個索引,其中僅包含與您的正則表達式不匹配的文檔:

POST /<db>/_index
{
  "index": {
    "partial_filter_selector": {
      "url": {
         "$not": {
            "$regex": ".*box.*"
         }
      }
    },
    "fields": ["type"]
  },
  "ddoc" : "url-not-box",
  "type" : "json"
}

然后在查詢時間:

{
   "selector": {
      "url": {
         "$not": {
            "$regex": ".*box.*"
         }
      }
   },
   "limit": 50,
   "use_index": "url-not-box"
}

您可以在Cloudant UI中查看掃描了多少文檔以完成查詢-執行統計信息顯示在查詢文本區域下方的彈出窗口中。

您可能還會發現本文有關部分索引的文章很有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM