翻译或纠错本页面
关键词搜索建模¶
注解
关键词搜索和文本搜索及全文检索不同,它不提供类似于断词或者词干提取等文本处理功能。更多相关介绍请参见 关键词索引的局限性 部分。
从2.4版本开始, MongoDB提供全文检索功能: 文本索引。
如果你的应用需要对某个文本字段进行查询,你可以用完全匹配或使用正则表达式 $regex 。但是很多情境下这些手段不能够满足应用的需求。
下面这个范式介绍了一种在同一个文档内使用数组来保存关键词再对数组建多键索引 (multi-key index)的方式来实现关键词搜索。
范式¶
为实现关键词搜索,在文档内增加一个数组字段并把每一个关键词加到数组里。然后你可以对该字段建一个 多键索引。这样你就可以对数组里面的关键词进行查询了。
例子
假如你希望对图书馆的藏书实现一个按主题搜索的功能。 对每一本书,你可以加一个数组字段 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 } )
多键索引会对数组里的每一个值建立一个索引项。在这个例子里 whaling 和 allegory 个各有一个索引项。
现在你可以按关键词进行搜索,如:
db.volumes.findOne( { topics : "voyage" }, { title: 1 } )
注解
如果数组较大,达到几百或者几千以上的关键词,那么文档插入操作时的索引维护开支会大大增加。
关键词索引的局限性¶
MongoDB 的这种关键词搜索方案和专门的全文搜索工具软件相比有以下的局限性:
词干提取。 MongoDB的关键词查询无法对相近词进行归并处理。
同义词。 对同义词的处理目前必须在应用程序端完成。MongoDB无法支持这一点。
权重。 关键词之间没有权重支持,所有关键词的重要性都一样,无法优化结果排序。
- Asynchronous Indexing. MongoDB builds indexes synchronously, which means that the indexes used for keyword indexes are always current and can operate in real-time. However, asynchronous bulk indexes may be more efficient for some kinds of content and workloads.