2014-10-08 100 views
1

我想創建以下查詢的MongoDB指數:蒙戈DB創建精確的指數

{ 
    "$and": [ 
    { 
     "$or": [ 
     { 
      "connector_name": { 
      "$options": "i", 
      "$regex": "plop" 
      } 
     }, 
     { 
      "connector": { 
      "$options": "i", 
      "$regex": "plop" 
      } 
     }, 
     { 
      "component": { 
      "$options": "i", 
      "$regex": "plop" 
      } 
     }, 
     { 
      "resource": { 
      "$options": "i", 
      "$regex": "plop" 
      } 
     }, 
     { 
      "domain": { 
      "$options": "i", 
      "$regex": "plop" 
      } 
     }, 
     { 
      "perimeter": { 
      "$options": "i", 
      "$regex": "plop" 
      } 
     } 
     ] 
    }, 
    { 
     "$or": [ 
     { 
      "event_type": { 
      "$eq": "check" 
      } 
     } 
     ] 
    } 
    ] 
} 

我嘗試了以下索引創建失敗:

一級指標嘗試:

db.events.ensureIndex({'event_type': 1}); 
db.events.ensureIndex({'connector_name': 1}); 
db.events.ensureIndex({'connector': 1}); 
db.events.ensureIndex({'component': 1}); 
db.events.ensureIndex({'resource': 1}); 
db.events.ensureIndex({'domain': 1}); 
db.events.ensureIndex({'perimeter': 1}); 

第二項索引嘗試:

db.events.ensureIndex({'event_type': 1, 'connector_name': 1}); 
db.events.ensureIndex({'event_type': 1, 'connector': 1}); 
db.events.ensureIndex({'event_type': 1, 'component': 1}); 
db.events.ensureIndex({'event_type': 1, 'resource': 1}); 
db.events.ensureIndex({'event_type': 1, 'domain': 1}); 
db.events.ensureIndex({'event_type': 1, 'perimeter': 1}); 

三級指標嘗試:

db.events.ensureIndex(
{ 
    'event_type': 1, 
    'connector_name': 1, 
    'connector': 1, 
    'component': 1, 
    'resource': 1, 
    'domain': 1, 
    'perimeter': 1, 
}) 

每次和以下mongo explain query,我看着「indexOnly」和(我的理解),意思是「nscanned」領域的良好蒙戈使用我的索引。但是,直到現在,結果很差,我的查詢仍然沒有使用索引。盡我所有的努力,我仍然不明白mongodb索引系統在哪裏出錯。

+1

您正在使用不區分大小寫的正則表達式匹配,這將始終導致完整的索引掃描(最好)..並且使用'$或'子句,'nscanned'值將加起來到所有字段的基數你在比較。你能描述一下你實際需要搜索的東西 - 只是關鍵字,還是你需要在所有這些領域進行子串匹配? – Stennie 2014-10-08 10:00:41

+0

使用此查詢,我想查找包含查詢值的所有匹配文檔,這裏是「plop」。現在,我會嘗試做一個區分大小寫的搜索,正如你所建議的,希望mongo能夠使用我的索引。實際上,這個查詢的目的是在我的文檔和搜索引擎中執行搜索。這就是爲什麼我的搜索是寬容的。 – utopman 2014-10-08 10:52:21

+0

我改變了我的查詢,現在它看起來像 「$或」:[{ 「CONNECTOR_NAME」:{ 「$正則表達式」: 「/^Sphinx.*/」 }} ... 與我之前描述的第三個索引模型,但索引搜索仍然無法正常工作 – utopman 2014-10-08 11:17:59

回答

1
db.collection.ensureIndex({connectorname:"text",connector:"text",component:"text"...}) 

它在字段上創建文本索引。然後,您可以查詢像

db.collection.find({$or:[{$text:{$search:"plop"},{event_type:"check"}]}) 

將返回包含文本索引是爲創建或領域的搜索項有EVENT_TYPE ==「檢查」的所有文檔。

有關詳細信息,請參閱the MongoDB docs on "Text Indices"

+0

Hallo Markus,文本字段在我的情況下無法工作,如在mongo文檔中所述:[text indices](http://docs.mongodb.org/manual/ core/index-text /)**一個集合最多隻能有一個文本索引**但是,在我的情況下,我需要很多這些搜索字段 – utopman 2014-10-08 11:16:41

+0

我非常瞭解這些文檔。爲什麼你需要多個文本索引?如圖所示簡單地創建一個複合索引。您可以使用匯總而不是查詢來將包含搜索詞的文檔排除在不需要的字段中。 – 2014-10-08 11:19:55