前言
此篇博文是 Mongdb 基础系列之一;主要介绍 MongoDB 的数据建模相关内容;
本文为作者的原创作品,转载需注明出处;
Model Data to Support Keyword Search
Keyword 查询和文本查询不同,文本参数主要是通过文本精确匹配或者使用 $regex 正则表达式来进行匹配;而这里所指的 Keyword Search 既关键字查询则主要是将一系列的关键字通过 document 的一个队列 array 来进行存储;通过与 multi-key index 结合使用,这使得应用可以支持关键字查询操作;
实现
为了使得你的 document 能够支持基于关键字的查询,首先,在你的 document 创建一个 array field,然后将关键字当做 strings 添加到该 array 中,最后,在该 array field 上创建 multi-key index;这样,你就可以在该 array 上进行值查询了;来看下面这个例子,比如你想对某本书进行主题关键字搜索,这个时候,你可以在该 document 上创建一个名为 topics 的 array,然后尽量的将你想到的关键字作为值填入;比如,《Moby-Dick》由作者 Herman Melville 所著,
1 | { title : "Moby-Dick" , |
然后,为该 topics field 创建 multi-key index,
1 | db.volumes.createIndex( { topics: 1 } ) |
multi-key index 将会为 array 中的每个元素单独创建 index entry;比如,whaling 将会有单独的一个 index entry,allegory 也会单独的享有一个 index entry;
你可以通过关键字进行查询,比如,
1 | db.volumes.findOne( { topics : "voyage" }, { title: 1 } ) |
注意,
如果一个 array 中包含成千上万个关键字的话,要注意索引所带来的开销;
关键字索引的限制
当使用 multi-key index 来作为关键字的索引的时候,要注意下面这些限制,
- Stemming 词干;MongoDB 中的关键字查询不能解析关键词的词干或者解析成相似部分;
- Synonyms 同义词;如果要使用同义词查询,必须在应用层实现,MongoDB 不支持;
- Ranking 排行;关键字查询中不提供诸如类似 Sql 的 Ranking 查询功能;
- Asynchronous Indexing 异步索引;MongoDB 是通过同步的方式建立索引的;但是异步的方式可以提供更快的响应更好的用户体验;
References
https://docs.mongodb.com/manual/applications/data-models-applications/