作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图在 Java 中为 MongoDB 构建查询,但每次运行查询时都会遇到此错误“无法规范化查询:BadValue 文本表达式过多”。
数据库中充满了具有文本属性的文档,这些文档被索引用于全文搜索。我正在尝试构建一个查询以查找与 queryList 中的一个或多个查询匹配并且在特定时间范围内的任何文档。如果 queryList 中只有一个查询,它工作正常,否则失败。
有什么想法吗?
BasicDBList queryList = new BasicDBList();
for(String queryString : queryStrings)
{
queryList.add(new BasicDBObject("$text", new BasicDBObject("$search", queryString)));
}
BasicDBObject queries = new BasicDBObject("$or", queryList);
DBObject query = QueryBuilder.start()
.and(endpointQuery,
QueryBuilder.start().put("time").greaterThan(minTime).get(),
QueryBuilder.start().put("time").lessThan(maxTime).get())
.get();
DBCursor cursor = tweets.find(query);
最佳答案
错误非常准确。您要做的是在 $or
中创建“多个文本查询”健康)状况。 MongoDB 无法做到这一点,事实上它在 Restrictions 的第一行中有说明。在 $text
的手册页中.
此外,您不应该这样做,而是在您的集合中指定一个文本索引以在需要时搜索多个字段:
db.collection.ensureIndex({ "comments": "text", "title": "text" })
然后您可能想要分配权重 as shown here .
但似乎您真正要问的只是搜索“多个术语”。因此,您不为此使用 $ 或
,而只需提交以空格分隔的术语列表:
db.collection.find({ "$text": { "$search": "something else" } })
然后在文本索引中的任何字段的上下文中搜索空格分隔列表中的任何单词,并且将返回包含“任何”这些单词的任何文档。结果按该列表中单词的更多匹配项的“权重”排序。
关于MongoDB 无法规范化查询 : BadValue Too many text expressions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29020211/
我是一名优秀的程序员,十分优秀!