蒙戈DB创建精确的指数

蒙戈DB创建精确的指数

问题描述:

我想创建以下查询的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

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