【问题标题】:MONGODB Full Text Search Logical OR QueryMONGODB全文搜索逻辑或查询
【发布时间】: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


【解决方案1】:

最后我解决了如下所列

// Create an empty filter and make sure it is not null
var builder = Builders<Track>.Filter;
FilterDefinition<Track> filter = builder.Empty;

string[] searchWords = queryString.Split(' ');
if (ArtistChecked){
  foreach (var words in searchWords){
   //regex could be changed with options like ignore case
   filter &= builder.Regex("Artist", BsonRegularExpression.Create(new System.Text.RegularExpressions.Regex(word)));
  }
}
if (AlbumChecked){
  foreach (var words in searchWords){
   //regex could be changed with options like ignore case
   filter &= builder.Regex("Album", BsonRegularExpression.Create(new System.Text.RegularExpressions.Regex(word)));
  }
}

最后,您在 MongoQuery 中使用构建过滤器;可以混合 OR-Operators 并对查询中的某些字段使用 EQ;但这样你就可以动态地构建查询。 当然,性能不如完全匹配(使用 FullTextSearch),但这将使所需的搜索方法可用。通过使用索引并说它以前缀开头,性能可能会更好

如果字段存在索引,则 MongoDB 将正则表达式与索引中的值进行匹配,这可能比集合扫描更快。如果正则表达式是“前缀表达式”,则可以进行进一步优化,这意味着所有潜在匹配都以相同的字符串开头。这允许 MongoDB 从该前缀构造一个“范围”,并且只匹配索引中落在该范围内的那些值。

来源:https://docs.mongodb.org/manual/reference/operator/query/regex/#index-use

在我的情况下,这不会,因为用户应该能够以他们想要的任何顺序输入搜索词;而且由于它只需要出现在字段内部,因此无法保证使用正确的顺序。

开放以获取如何使这个更快/更好的建议

附:从MongoDB substring product search order by highest match得到解决的想法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2022-10-05
    • 2012-12-16
    • 2014-11-24
    • 1970-01-01
    • 2020-07-15
    • 2020-08-14
    相关资源
    最近更新 更多