MongoDB 基础系列七:数据建模之特殊情况二,支持关键字查询

前言

此篇博文是 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
2
3
4
5
6
7
{ title : "Moby-Dick" ,
author : "Herman Melville" ,
published : 1851 ,
ISBN : 0451526996 ,
topics : [ "whaling" , "allegory" , "revenge" , "American" ,
"novel" , "nautical" , "voyage" , "Cape Cod" ]
}

然后,为该 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/