我正在尝试使用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);
答案 0 :(得分:7)
错误很准确。你要做的是创建"多个文本查询"在$or
条件下。 MongoDB无法做到这一点,事实上它已在Restrictions的手册页的$text
的第一行中说明。
此外,您不是假设这样做,而是在您的集合中指定一个文本索引,以便在需要时搜索多个字段:
db.collection.ensureIndex({ "comments": "text", "title": "text" })
然后你可能想要分配权重as shown here。
但似乎你真正要求的是搜索"多个术语"。因此,您不能使用$or
,只需提交以空格分隔的字词列表:
db.collection.find({ "$text": { "$search": "something else" } })
然后在文本索引中的任何字段的上下文中搜索空格分隔列表中的任何单词,以及包含"任何"的任何文档。这些单词将被退回。结果由" weight"该列表中单词的更多匹配。