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

4
我正在尝试使用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);

也许你只是把它们混淆了,但我没有看到你使用 queries 对象来执行查询,而且 endpointQuery 没有定义。这些应该有相同的名称,还是查询的其他部分? - mnemosyn
尽管问题没有显示正在执行的查询,但明显的问题是MongoDB无法在单个查询中执行多个“text”或“geospatial”索引表达式。您也不能在同一查询中“混合”文本或地理空间。 - Neil Lunn
@NeilLunn:为自己辩护一下,当时喝了点酒;-) +1 - mnemosyn
@mnemosyn 在酒中说真话永远是一个可以接受的借口 :) - Neil Lunn
1个回答

10
错误非常明显。你试图在$or条件中创建“多个文本查询”。MongoDB无法做到这一点,实际上在限制的第一行中已经说明了这一点,在$text的手册页面中也有说明。
此外,你不应该这样做,而是在集合上指定一个文本索引以搜索多个字段(如果需要)。
db.collection.ensureIndex({ "comments": "text", "title": "text" })

然后您可能希望分配权重,如此所示

但似乎您真正想要的是搜索“多个术语”。因此,您不需要使用$or,而只需提交由空格分隔的术语列表即可:

db.collection.find({ "$text": { "$search": "something else" } })

空格分隔列表中的任何单词都会在文本索引中的字段上下文中进行搜索,并返回包含“任何”这些单词之一的任何文档。结果按照该列表中单词的更多匹配的“权重”排序。


谢谢,显然我在查看文档时忽略了限制。 - thraxst
@thraxst 很高兴你学到了东西。别忘了接受答案。 - Neil Lunn
2
我在我的问题中没有完全解释我的做法,但是每个“查询字符串”都是一个以空格分隔的术语列表,必须在文档中包含。例如,queryString数组看起来像 [ "New York Yankees", "Boston Red Sox", "Detroit Tigers" ],我正在尝试找到包含至少其中一个字符串中所有术语的任何文档。您知道是否可以通过一个查询实现这一点,而无需在之后过滤结果,或者是否需要为每个“查询字符串”执行一个查询? - thraxst
@thraxst 在 MongoDB 的文本搜索中,您不能指定“短语”。这只是基本的功能。如果您需要更高级的功能,请使用文本搜索引擎。我相信您的问题已经得到解答。 - Neil Lunn
@Neil 我正在Heroku上使用Parse服务器,遇到了相同的问题,请问我该如何在Parse服务器上应用此解决方案。我的原始问题在这里 https://stackoverflow.com/questions/59014852/fulltext-is-not-working-in-parse-server-with-mlab - Kishor Patidar
@KishorPatidar 保持理智,远离Parse。 - Damien Roche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接