我试图在Morphia中使用MongoDB全文索引.我需要返回每个文档的分数,并将结果排序.如果没有Morphia,这就是我的查询:
db.getCollection('disease').find( { $text: { $search: "brain" } },
{ score: { $meta: "textScore" } } )
.sort( { score: { $meta: "textScore" } } )
这可以正常工作并返回按分数排序的匹配.
我也可以在没有Morphia的情况下直接使用MongoDB Java驱动程序.
// search with the Java driver
BasicDBObject textSearch = new BasicDBObject("$search", "brain");
BasicDBObject search = new BasicDBObject("$text", textSearch);
BasicDBObject meta = new BasicDBObject("$meta", "textScore");
BasicDBObject score = new BasicDBObject("score", meta);
List<DBObject> diseases = collection.find(search, score).sort(score).toArray();
Assert.assertEquals(2, diseases.size());
Assert.assertEquals("brain", diseases.get(0).get("name"));
Assert.assertEquals("benign-brain", diseases.get(1).get("name"));
我无法弄清楚如何在Morphia中完成同样的事情.以下是Morphia文档(http://mongodb.github.io/morphia/1.0/guides/querying/#text-searching)中的示例:
List<Greeting> good = datastore.createQuery(Greeting.class)
.search("good")
.order("_id")
.asList();
Assert.assertEquals(4, good.size());
该示例不返回分数,并按“_id”排序.我没有看到任何方法来处理Morphia中的$meta运算符.有没有人做过类似的事情?
最佳答案 因为Morphia映射回您的类型,在这种情况下公开分数的唯一方法是将分数字段添加到您的实体类型并将其映射回该字段.这不是很棒,因为它开始用数据库元数据字段污染您的业务类型.您总是可以尝试映射一个包含您想要的任何元数据的特殊值对象类型.这至少可以使您的业务对象不受此元数据的影响.