rus*_*dot 22 indexing text mongodb
对于包含字符串的MongoDB字段(例如,州名或省名),在字符串类型字段上创建索引之间存在什么(如果有)差异:
db.ensureIndex( { field: 1 } )
Run Code Online (Sandbox Code Playgroud)
并在该字段上创建文本索引:
db.ensureIndex( { field: "text" }
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,field都是string类型的.
我正在寻找一种方法,在文本字段上进行不区分大小写的搜索,该字段包含一个单词(可能更多).作为Mongo的新手,我无法区分使用上述两种索引方法,甚至是类似$regex搜索的方法.
Joh*_*one 33
两个索引选项非常不同.
在字符串字段上创建常规索引时,它会索引字符串中的整个值.对于您可以完全匹配的单个字符串(如登录用户名)非常有用.
另一个硬文本索引将标记并阻止该字段的内容.因此,它会将字符串分解为单个单词或标记,并将进一步将它们缩减为它们的词干,以便相同单词的变体匹配(例如,"谈话"匹配"谈话","谈话"和"谈话",如"谈话"是三者之一".对真文本(句子,段落等)非常有用.
文字搜索
文本搜索支持在集合的文档中搜索字符串内容.MongoDB使
$text运营商能够在查询和聚合管道中执行文本搜索.文本搜索过程:
Run Code Online (Sandbox Code Playgroud)tokenizes and stems the search term(s) during both the index creation and the text command execution. assigns a score to each document that contains the search term in the indexed fields. The score determines the relevance of a document to a given search query.该
$text运营商可以搜索的单词和短语.查询匹配完整的词干.例如,如果文档字段包含单词blueberry,则对术语blue的搜索将与文档不匹配.但是,对蓝莓或蓝莓的搜索将匹配.
$regex搜索可以与字符串字段上的常规索引一起使用,以提供一些模式匹配和通配符搜索.不是一个非常有效的索引用户,但它会使用索引,它可以:
如果该字段存在索引,则MongoDB会将正则表达式与索引中的值进行匹配,这可能比收集扫描更快.如果正则表达式是"前缀表达式",则可以进一步优化,这意味着所有可能的匹配都以相同的字符串开头.这允许MongoDB从该前缀构造"范围",并且仅匹配来自该范围内的索引的那些值.
http://docs.mongodb.org/manual/core/index-text/
http://docs.mongodb.org/manual/reference/operator/query/regex/
文本索引允许您在文本中搜索单词。您可以在非文本索引文本字段上使用正则表达式执行相同操作,但速度会慢得多。
在 MongoDB 2.6 之前,文本搜索操作必须使用自己的命令进行,这是一个很大的缺点,因为您无法将其与其他过滤器结合使用,也无法将结果视为公共游标。到目前为止,文本搜索只是典型find方法的另一个运算符,这非常好。
那么,为什么文本索引及其后续搜索比非索引文本字段上的正则表达式更快?这是因为文本索引就像一本字典,一个聪明的字典,能够根据每种语言丢弃单词(默认为英语)。当您运行文本搜索查询时,您会针对字典运行它,从而节省了原本会花费在遍历整个集合上的时间。
请记住,文本索引会随着您的收藏而增长,并且会占用大量空间。我在使用上限集合时很难学到这一点。没有办法限制文本索引。
一个普通索引的文本字段,如
db.ensureIndex( { field: 1 } )
Run Code Online (Sandbox Code Playgroud)
仅当您搜索整个文本时才有用。例如,它用于查找字母数字哈希。在存储文本段落、短语等时应用这种索引没有任何意义。