MongoDB Java API:全文搜索

bar*_*gro 5 java full-text-search mongodb

我在使用Java API for MongoDB时遇到问题.我使用Robomongo创建了一个查询:

db.collection.find(
    {$text : {$search : "\"expression\" keyword"}},
    {score : {$meta : "textScore"}}
).sort({score : {$meta : "textScore"}})
Run Code Online (Sandbox Code Playgroud)

现在我想使用Java API创建相同的查询:

DBObject searchCommand = new BasicDBObject(
    "$text", new BasicDBObject("$search", "\"expression\" keyword")
).append(
    "score", new BasicDBObject("'$meta'", "textScore")
);

DBObject sorting = new BasicDBObject(
    "score", new BasicDBObject("'$meta'", "textScore")
);

DBCursor result = collection.find(searchCommand).sort(sorting);
Run Code Online (Sandbox Code Playgroud)

问题是这段代码不起作用.查询:

DBObject searchCommand = new BasicDBObject(
    "$text", new BasicDBObject("$search", "\"expression\" keyword")
);
Run Code Online (Sandbox Code Playgroud)

工作得很好.在追加第二部分之后,所有结果都变得不可见.更重要的是,这一行:

DBCursor result = collection.find(searchCommand).sort(sorting);
Run Code Online (Sandbox Code Playgroud)

抛出MongoException(BadValue错误的排序规范).当我删除sort()方法调用时,Exception不存在,但我仍然没有任何结果(如果我追加"得分").

我找到了解决这个问题的方法,但是使用了Spring.我不想使用任何其他库.另外,我是MongoDB的初学者.谢谢你的帮助和时间,欢呼.


UPDATE.问题解决了.将"score"附加到查询searchCommand作为find()的第一个参数传递是错误的."得分"应作为find()方法的第二个参数在单独的DBObject中传递,如下所示:

DBObject search = new BasicDBObject(
    "$text", new BasicDBObject("$search", "\"expression\" keyword")
);

DBObject project = new BasicDBObject(
    "score", new BasicDBObject("$meta", "textScore")
);

DBObject sorting = new BasicDBObject(
    "score", new BasicDBObject("$meta", "textScore")
);

DBCursor result = collection.find(search, project).sort(sorting);
Run Code Online (Sandbox Code Playgroud)

Bat*_*eam 7

你已经尝试了,你真的很亲密.

请注意,在,

db.collection.find(
    {$text : {$search : "\"expression\" keyword"}},
    {score : {$meta : "textScore"}}
).sort({score : {$meta : "textScore"}})
Run Code Online (Sandbox Code Playgroud)
  • {$text : {$search : "\"expression\" keyword"}}- 是query部分.

  • {score : {$meta : "textScore"}}- 是projection部分.

在您尝试使用Java驱动程序实现的内容中,

DBObject searchCommand = new BasicDBObject(
    "$text", new BasicDBObject("$search", "\"expression\" keyword")
).append(
    "score", new BasicDBObject("'$meta'", "textScore")
);
Run Code Online (Sandbox Code Playgroud)

最终会产生,

{$text:{$search:"\"expression\" keyword"},"score":{"meta":"textscore"}}
Run Code Online (Sandbox Code Playgroud)

这不等同于本机查询.即使是预期的 projection陈述也是其query本身的一部分.

需要注意的是,这最终找了一个名为场score,因为它现在已经成为一个部分query没有projection.

您可以轻松修改您的DBObject实例,使其成为projection参数的一部分,它可以工作:

DBObject findCommand = new BasicDBObject(
    "$text", new BasicDBObject("$search", "keyword")
);

DBObject projectCommand =  new BasicDBObject(
    "score", new BasicDBObject("$meta", "textScore"));

DBObject sortCommand = new BasicDBObject(
    "score", new BasicDBObject("$meta", "textScore")
);
DBCursor result = collection.find(
                                  findCommand ,projectCommand)
                                  .sort(sortCommand );
Run Code Online (Sandbox Code Playgroud)