我可以在同一个字段上使用多种类型的索引吗?它会影响性能吗?
示例:
db.users.createIndex({"username":"text"})
db.users.createIndex({"username":1})
答案 0 :(得分:3)
是的,您可以在单个字段上使用不同类型的索引。您可以创建类型为text,2dsphere,hash
的索引您无法使用稀疏和唯一选项创建相同的索引。
在这种情况下,每个写操作都将更新所有可能类型的相关索引条目
答案 1 :(得分:1)
两个索引选项非常不同。
在字符串字段上创建常规索引时,它会索引字符串中的整个值。对于您可以完全匹配的单个字符串(如登录用户名)非常有用。
另一个硬文本的文本索引将标记化并阻止该字段的内容。因此,它会将字符串分解为单个单词或标记,并进一步将它们缩小到它们的词干,以便相同单词的变体匹配("谈话"匹配"会谈",&# 34;谈论"和#34;谈话"例如,"谈话"是所有三个的主干。对真文本(句子,段落等)非常有用。 文字搜索
文本搜索支持在集合的文档中搜索字符串内容。 MongoDB提供了$ text运算符,用于在查询和聚合管道中执行文本搜索。
文本搜索过程:
在索引创建和文本命令执行期间标记并限制搜索项。 为包含索引字段中的搜索词的每个文档分配分数。分数决定了a的相关性 记录给定的搜索查询。
$ text运算符可以搜索单词和短语。查询匹配完整的词干。例如,如果文档字段包含单词blueberry,则对术语blue的搜索将与文档不匹配。但是,对蓝莓或蓝莓的搜索将匹配。 $ regex搜索可以与字符串字段上的常规索引一起使用,以提供一些模式匹配和通配符搜索。不是一个非常有效的索引用户,但它会使用索引,它可以: 如果该字段存在索引,则MongoDB会将正则表达式与索引中的值进行匹配,这可能比收集扫描更快。如果正则表达式是“前缀表达式”,则可以进一步优化,这意味着所有可能的匹配都以相同的字符串开头。这允许MongoDB从该前缀构造一个“范围”,并且仅匹配该范围内的索引中的那些值。
http://docs.mongodb.org/manual/core/index-text/
http://docs.mongodb.org/manual/reference/operator/query/regex/