2016-01-14 257 views
1

我目前正在研究一个需要在1000ms以下搜索(在本地机器上)大型数据库(+25.000.000条记录)的项目。这让我想到了MongoDB,并且可以达到期望的性能。我可以通过几种不同的索引做到这一点,但我需要能够部分匹配。MONGODB全文检索逻辑或查询

允许最终用户在几个字段上进行搜索。 (并非所有字段;需要能够搜索字段的5/9的其余部分是元数据不为终端用户搜索)

我第一次尝试创建复合指数(上的所有5个字段)全文搜索

db.tracks.find({$text:{$search:"Greatest Hits"}})

这似乎是工作得相当好,并给了我各种结果与大,最大的和击中任何复合的字段。

但是用户应该能够选择他想要搜索的字段。 (例如:AlbumTitle,TrackTitle等)。这意味着当曲目标题被切换时,我不希望来自该列的结果。

db.tracks.find({AlbumTitle: "Greatest Hits"}) 

上面的查询就能够找到完全匹配和最伟大的搜索时,因此没有发现相同的结果。这使我想到像下面

db.tracks.find({AlbumTitle: {$text: {$search: "Greatest Hits"}}}) 

但是,这并不工作,因为那么$文本将是一个未知的运营商。

如果像上面将有可能我就能够建立我的查询动态基础上,切换字段,如

db.tracks.find({$or: [ {ToggledField1: ...}, {ToggeldField4: ...} ]}) 

,因此只需要的字段查询保证。这会在所有可能MongoDB数据库中,如果有什么是要实现所期望的功能提前

+0

我可以听到一个声音告诉我[正则表达式](https://docs.mongodb.org/manual/reference/operator/query/regex/) – styvane

+0

这不会是时间消费?由于数据库需要在少于1000毫秒内搜索? – maxhamulyak

回答

0

在我解决它的结束

感谢的最好方式下面

// 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运算符中混合使用EQ来查询查询中的某些字段;但这种方式可以动态构建查询。 当然,性能不如完全匹配(使用FullTextSearch),但这会使搜索方法需要可用。性能可以通过使用指数,说来也尤为明显前缀

如果有一个索引的字段,然后针对的MongoDB在索引中的值,可以比一个集扫描速度更快的正则表达式匹配开始。如果正则表达式是“前缀表达式”,则可能会发生进一步优化,这意味着所有可能的匹配都以相同的字符串开头。这允许MongoDB根据该前缀构造一个“范围”,并仅与来自该范围内索引的那些值匹配。

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

在我而言这不会做,因为用户应该能够在任何他们想要的顺序输入搜索词;并且由于它只是出现在现场内部,所以没有办法保证使用正确的订单。

欢迎联系我们,我们会尽快为您解答。更多

P.S.有想法解决它从MongoDB substring product search order by highest match