【发布时间】:2016-04-20 02:02:35
【问题描述】:
我目前正在开展一个项目,需要在 1000 毫秒内(在本地计算机上)搜索大型数据库(+25.000.000 条记录)。这让我想到了 MongoDB,并且可以达到预期的性能。我可以通过几种不同类型的索引来做到这一点,但是我需要能够部分匹配。
最终用户可以搜索几个字段。 (并非所有字段;需要能够搜索 5/9 的字段,其余是最终用户无法搜索的元数据)
我首先尝试为全文搜索创建复合索引(在所有 5 个字段上)
db.tracks.find({$text:{$search:"Greatest Hits"}})
这似乎运作良好,并在任何复合字段上为我提供了 Great、Greatest 和 Hits 的各种结果。
但是,用户应该能够选择他想要搜索的字段。 (例如:AlbumTitle、TrackTitle 等)。这意味着当曲目标题被关闭时,我不想要该列的结果。
db.tracks.find({AlbumTitle: "Greatest Hits"})
上述查询将能够找到完全匹配,因此在 Greatest 上搜索时找不到相同的结果。这让我想到了以下内容
db.tracks.find({AlbumTitle: {$text: {$search: "Greatest Hits"}}})
但这不起作用,因为 $text 将是一个未知的运算符。
如果可能发生上述情况,我将能够根据切换字段动态构建查询,例如
db.tracks.find({$or: [ {ToggledField1: ...}, {ToggeldField4: ...} ]})
从而确保只查询所需的字段。这在 MongoDB 数据库中是否可行,如果可以,实现所需功能的最佳方法是什么
提前致谢
【问题讨论】:
-
我能听到一个声音告诉我regex
-
这不是很耗时吗?由于需要在不到 1000 毫秒的时间内搜索数据库?
标签: mongodb indexing full-text-search nosql