Spring Mongo不区分大小写的搜索正则表达式

时间:2012-07-31 14:13:47

标签: regex spring mongodb case-insensitive string-matching

我正在Mongo中尝试不区分大小写的搜索。基本上我想要不区分大小写的字符串匹配我正在使用正则表达式。这是我的代码

Query query = new Query( Criteria.where(propName).regex(value.toString(), "i"));

但上面的剂量匹配我的整个字符串(有时用空格的字符串)。它返回值,即使它是一个子字符串。

例如:假设我的收藏品有2个值“Bill”和“Bill status”,即使我的搜索是“账单状态”,它也会返回“账单”。即使有字符串的子字符串,它也会返回结果我正在寻找

我尝试了Query query = new Query( Criteria.where(propName).is(value.toString()));

但以上是区分大小写的。有人可以帮忙解决这个问题。

2 个答案:

答案 0 :(得分:8)

使用正则表达式搜索的不敏感搜索。 input_location可能是德里,德里,德里,它适用于所有人。

Criteria.where("location").regex( Pattern.compile(input_location, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE)));   

答案 1 :(得分:2)

regex / ^ bill $ / i将以不区分大小写的方式与“Bill”匹配。

这是一个示例(在mongo shell中):

> db.foo.insert({name: "Bill"});
> db.foo.insert({name: "Bill status"});
> db.foo.insert({name: "another Bill"});
> db.foo.find()
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" }
{ "_id" : ObjectId("5018e191a499db774b92bf26"), "name" : "Bill status" }
{ "_id" : ObjectId("5018e19ba499db774b92bf27"), "name" : "another Bill" }
> db.foo.find({name: /bill/i})
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" }
{ "_id" : ObjectId("5018e191a499db774b92bf26"), "name" : "Bill status" }
{ "_id" : ObjectId("5018e19ba499db774b92bf27"), "name" : "another Bill" }
> db.foo.find({name: /^bill$/i})
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" }

但是,正则表达式查询不会使用索引,除非它是左根(即形式为/ ^前缀/)并且如果不使用i不区分大小写的标志。与使用索引的查询相比,您可能会付出相当大的性能损失。因此,根据您的使用情况,更好的选择可能是以某种方式使用应用程序逻辑,例如:

  1. 在将项目插入数据库时​​强制执行案例(例如,将“bill”转换为“Bill”)。

  2. 针对您的已知案例进行搜索(例如,仅针对“Bill”进行搜索)。