7

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

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

但是上面的内容与我的整个字符串匹配(有时带有空格的字符串)。即使它是子字符串,它也会返回值。

例如:假设我的收藏有 2 个值“Bill”和“Bill status”,即使我的搜索是“bill status”,它也会返回“bill”。即使我正在搜索的字符串有子字符串,它也会返回结果为了

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

但以上是区分大小写的。有人可以帮忙吗?

4

2 回答 2

9

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

Criteria.where("location").regex( Pattern.compile(input_location, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE)));   
于 2014-10-15T04:40:14.963 回答
3

正则表达式 /^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" }

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

  1. 当您将项目插入数据库时​​强制一个案例(例如将“bill”转换为“Bill”)。

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

于 2012-08-01T08:31:21.660 回答