将数据建模以支持关键字搜索
注意
关键词搜索与文本搜索或全文搜索不同,不提供词干提取或其他文本处理功能。更多信息请参见关键词索引的限制部分。
在2.4版本中,MongoDB提供了文本搜索功能。更多信息请参见自托管部署上的文本索引。
如果您的应用程序需要对包含文本的字段的内容进行查询,您可以对文本进行精确匹配或使用$regex
来使用正则表达式模式匹配。然而,对于许多文本操作,这些方法并不满足应用程序的需求。
此模式描述了一种使用MongoDB支持关键词搜索的方法,该方法使用存储在文本字段相同文档中的数组中的关键词。结合多键索引,此模式可以支持应用程序的关键词搜索操作。
模式
为了在文档中添加支持基于关键词查询的结构,在您的文档中创建一个数组字段,并将关键词作为字符串添加到数组中。然后,您可以在数组上创建一个多键索引,并创建从数组中选择值的查询。
示例
假设您有一个想要提供基于主题搜索的图书馆藏书集合。对于每一本书,您添加一个topics
数组,并为每一本书添加所需的关键词。
对于《白鲸记》卷,您可能有一个以下文档
{ 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 } )
注意
包含大量元素(如数百或数千个关键字)的数组将导致插入时的索引成本更高。
关键字索引的限制
MongoDB可以通过特定的数据模型和多键索引支持关键字搜索;然而,这些关键字索引在以下方面并不充分或与全文产品相当:
词干提取。MongoDB中的关键字查询无法解析关键词的根或相关词。
同义词。基于关键字的搜索功能必须在应用层提供对同义词或相关查询的支持。
排名。本文档中描述的关键字查找没有提供对结果进行加权的方法。
异步索引。MongoDB同步构建索引,这意味着关键字索引所使用的索引始终是最新的,并且可以实时操作。然而,对于某些类型的内容和工作负载,异步批量索引可能更有效率。