MongoDB无法规范化查询:BadValue文本表达式太多

thr*_*xst 2 full-text-search mongodb mongodb-query

我试图在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);
Run Code Online (Sandbox Code Playgroud)

Nei*_*unn 7

错误很准确.您要做的是在$or条件中创建"多个文本查询" .MongoDB不能这样做,事实上它在手册页的第一行限制中说明了$text.

此外,您不应该这样做,而是在您的集合上指定一个文本索引,以便在需要时搜索多个字段:

db.collection.ensureIndex({ "comments": "text", "title": "text" })
Run Code Online (Sandbox Code Playgroud)

然后你可能想要分配权重,如下所示.

但似乎你真正要求的是搜索"多个术语".所以你不要使用$orfor,但只提交用空格分隔的术语列表:

db.collection.find({ "$text": { "$search": "something else" } })
Run Code Online (Sandbox Code Playgroud)

然后,在文本索引内的任何字段的上下文中搜索空格分隔列表中的任何单词,并且将返回包含"任何"这些单词的任何文档.结果按"重量"排序,列表中的单词匹配更多.

  • 我没有完全解释我在我的问题中做了什么,但每个“queryString”都是一个空格分隔的术语列表,必须在文档中。例如, queryString 数组看起来像 [ "New York Yankees", "Boston Red Sox", "Detroit Tigers" ] 并且我正在尝试查找至少包含这些字符串之一中的所有术语的任何文档。您是否知道这是否可以通过一个查询实现而无需在之后过滤结果,或者我是否需要为每个“queryString”执行一个查询? (2认同)