【发布时间】:2012-06-03 08:16:00
【问题描述】:
MongoDB/mongoose 'like' 语句中是否有诸如 SQL 语言之类的语句? 使用的唯一原因是全文搜索的实现。
【问题讨论】:
-
在 MongoDB Atlas 中使用 Lucene 也有一种新的更好的方法来完成此任务:docs.atlas.mongodb.com/atlas-search
MongoDB/mongoose 'like' 语句中是否有诸如 SQL 语言之类的语句? 使用的唯一原因是全文搜索的实现。
【问题讨论】:
虽然您可以使用正则表达式,但您在全文搜索中不会获得良好的性能,因为 /text/ 等包含查询 不能使用索引。
但是,诸如 /^text/ 之类的开头查询可以使用索引。
如果您正在考虑进行任何大规模的全文搜索,请考虑使用 MongoDB 的 Multi Key Search 功能。
更新
从 MongoDB v3.2 开始,您还可以使用 text index。
【讨论】:
我们可以通过 mongodb 的 java API 实现正则表达式的两种方式:
表达式 1: 我需要从文档字段中的那个字符串开始搜索
String strpattern ="your regular expression";
Pattern p = Pattern.compile(strpattern);
BasicDBObject obj = new BasicDBObject()
obj.put("key",p);
示例:(考虑我想搜索名称以“a”开头的任何地方)
String strpattern ="^a";
Pattern p = Pattern.compile(strpattern);
BasicDBObject obj = new BasicDBObject()
obj.put("name",p);
表达式 2:
我需要在一个字段中搜索多个单词,可以如下使用
String pattern = "\\b(one|how many)\\b";
BasicDBObject obj = new BasicDBObject();
//if you want to check case sensitive
obj.put("message", Pattern.compile(pattern,Pattern.CASE_INSENSITIVE));
【讨论】:
使用正则表达式:/^textforesarc$/i。只是不要忘记与性能说再见:)。 使用 like 模拟正则表达式搜索不会命中自定义索引。目前仅支持以开头。
【讨论】:
考虑在应用程序级别制作一个脚本,将您的数据转换为标记(单词)。然后将令牌视为标签,在这些令牌上建立索引,然后像搜索标签一样搜索令牌。这就像创建一个倒排索引。
要获得更好的文本搜索功能,请考虑使用 Lucene 而不是 MongoDB。
【讨论】:
MongoDB 支持RegularExpressions。
【讨论】: