Morphia 1.5.2查询对象存在多余反斜杠,MongoDB全文搜索返回0结果
解决Morphia短语全文搜索的转义问题
你的问题出在手动给搜索词添加双引号后,Morphia对双引号进行了二次转义,导致MongoDB无法识别这是一个短语搜索条件。
具体来说,你手动拼接的"\"" + textToFilter + "\""在Java中是一个带双引号的字符串(比如"filteredText"),但Morphia在将这个字符串序列化为BSON查询时,会自动转义双引号,最终发送给MongoDB的查询变成了"$search" : "\\"filteredText\\""——这里的转义双引号会被MongoDB当成搜索词的一部分,而非短语搜索的语法标记,所以自然返回0条结果。
下面是两种正确的解决方法:
方法1:用MongoDB原生Filters构建text查询
跳过Morphia的search()方法,改用filter()配合MongoDB官方的Filters.text()来构造查询,它会自动处理短语搜索的语法,避免不必要的转义:
import com.mongodb.client.model.Filters; import org.mongodb.morphia.query.Query; // 构建正确的短语搜索查询 Query<MyEntity> query = datastore.find(MyEntity.class) .disableValidation() .filter("$text", Filters.text(String.format("\"%s\"", textToFilter)));
方法2:手动构造$text查询文档
如果你想直接控制BSON结构,可以手动创建BasicDBObject来定义$text条件,这样能完全掌控查询内容:
import com.mongodb.BasicDBObject; import org.mongodb.morphia.query.Query; // 构造$text短语搜索条件 BasicDBObject textQuery = new BasicDBObject("$text", new BasicDBObject("$search", String.format("\"%s\"", textToFilter))); // 执行查询 Query<MyEntity> query = datastore.find(MyEntity.class) .disableValidation() .filter(textQuery);
验证查询正确性
你可以通过query.toString()查看生成的查询语句,正确的短语搜索查询应该是这样的:
"$text" : { "$search" : "\"filteredText\"" }
这里的双引号没有被额外转义,MongoDB会识别这是一个短语搜索,返回匹配的结果。
另外别忘了确认你的集合已经创建了全文索引(比如在实体类字段上添加@Indexed(options = @IndexOptions(textual = true))注解),否则全文搜索也无法生效。
内容的提问来源于stack exchange,提问作者Sahar Ben-Shushan
相关产品推荐
相关产品推荐

