进入MongoDB中文手册(4.2版本)目录
注意
关键字搜索和文本搜索和全文检索不一样,并没有提供所产生或其他的文字处理功能。有关更多信息,请参见关键字索引的限制。
在2.4中,MongoDB提供了文本搜索功能。有关更多信息,请参见文本索引。
如果您的应用程序需要对包含文本的字段的内容执行查询,则可以对文本执行完全匹配,也可以通过$regex使用正则表达式模式匹配。但是,对于许多文本操作,这些方法不能满足应用程序要求。
此模式描述了一种支持关键字搜索的方法来支持应用程序的搜索功能,该方法使用存储在,与文本字段相同的文档中的,数组中的关键字。结合多键索引,此模式可以支持应用程序的关键字搜索操作。
1 模式
通过将结构添加到文档中,来支持基于关键字的查询,请在文档中创建一个数组字段,然后将关键字作为字符串添加到数组中。然后,您可以在数组上创建多键索引,并创建从数组中选择值的查询。
例如:
给定要提供基主题的搜索的图书馆合集的集合。对于每个合集,您都添加数组topics,并添加给定合集所需的任意多个关键字。
对于该Moby-Dick合集,您可能具有以下文档:
{ title : "Moby-Dick" ,
author : "Herman Melville" ,
published : 1851 ,
ISBN : 0451526996 ,
topics : [ "whaling" , "allegory" , "revenge" , "American" ,
"novel" , "nautical" , "voyage" , "Cape Cod" ]
}
然后,在topics数组上创建一个多键索引:
db.volumes.createIndex( { topics: 1 } )
多键索引为topics数组中的每个关键字创建单独的索引条目。例如,索引包含的一个条目whaling和的另一个条目allegory。
然后,您将根据关键字进行查询。例如:
db.volumes.findOne( { topics : "voyage" }, { title: 1 } )
注意
具有大量元素的数组,例如具有数百或数千个关键字的元素,将在插入时产生更高的索引成本。
2 关键字索引的限制
MongoDB可以使用特定的数据模型和多键索引来支持关键字搜索 ;但是,这些关键字索引在以下方面不足以与全文检索相提并论:
- 词干提取(Stemming)。 MongoDB中的关键字查询无法解析词根或相关词的关键字。
- 同义词(Synonyms)。基于关键字的搜索功能必须在应用程序层中提供对同义词或相关查询的支持。
- 排名(Ranking)。本文档中描述的关键字查找没有提供加权结果的方法。
- 异步索引(Asynchronous Indexing)。MongoDB同步构建索引,这意味着用于关键字索引的索引始终是最新的并且可以实时操作。但是,异步批量索引对于某些类型的内容和工作负载可能更有效。