Spring Data Mongo-执行常规搜索?

问题描述 投票:0回答:1

我经历了许多这样的链接:How to create full text search query in mongodb with spring-data?,但没有获得正确的方法。

我有一个Employee集合,其中包含1000个文档。我想赋予执行搜索ignorecase的能力,当我搜索ra时,我应该获得Ravi,Ram,rasika等名称。

我使用了下面的逻辑,效果很好,但是我想从性能的角度理解。有没有比这更好的解决方案了?

Query query = new Query(Criteria.where("employeeName").regex("^"+employeeName, "i")); 
mongodb spring-data-mongodb
1个回答
0
投票

您可以使用正则表达式在要应用查询过滤器的字段上创建索引。例如,考虑person集合中的文档:

{ "name" : "ravi" }
{ "name" : "ram" }
{ "name" : "John" }
{ "name" : "renu" }
{ "name" : "Raj" }
{ "name" : "peter" }

以下查询(从Mongo Shell运行)查找并获取名称以字母“ r”或“ R”开头的四个文档:

db.person.find( { name: { $regex: "^r", $options: "i" } } )

但是查询执行收集扫描,但name字段上没有索引。因此,在该字段上创建一个索引。

db.person.createIndex( { name: 1 } )

现在,运行查询并为同一查询生成查询计划(使用explain())。查询计划表明它是IXSCAN(索引扫描)。而且,这将是一个高效执行的查询。

请注意,在索引字段上进行前缀搜索(如上述使用^的查询一样,可以使查询执行得更快。

documentation

对于区分大小写的正则表达式查询,如果存在索引字段,然后MongoDB将正则表达式与索引中的值,它可以比集合扫描更快。如果正则表达式为“前缀”,则可以进行进一步的优化表达式”,表示所有可能的匹配都以相同的字符串。这允许MongoDB从中构造一个“范围”前缀,并且仅与落在索引中的那些值匹配在该范围内。

尽管文档说了以下内容(请参阅以下段落),但我运行的查询确实使用了索引,并且使用explain()生成的查询计划显示了索引扫描。

不区分大小写的正则表达式查询通常不能使用有效索引。 $ regex实现不支持排序规则并且无法利用不区分大小写的索引。

© www.soinside.com 2019 - 2024. All rights reserved.