Полнотекстовый поиск с оценкой текста с помощью драйвера C ++ для MongoDB

Как выполнить полнотекстовый поиск с драйвером C ++ для MongoDB? Я чувствую, что я очень близок к решению здесь, но мне не хватает чего-то тривиального.

Вот мой код:

void run() {
mongo::DBClientConnection db;
db.connect("localhost");

cout << "count:" << db.count("wiki.categories") << endl;

mongo::BSONObjBuilder oB;

mongo::BSONObj query_1 = mongo::fromjson("{\"$search\": \"success\"}");
mongo::BSONObj criteria_1 = mongo::fromjson("{\"$meta\": \"textScore\"}");

cout << query_1 << endl;
cout << criteria_1 << endl;

oB.append("$text", query_1);
oB.append("score", criteria_1);

BSONObj query = oB.obj();
cout << query << endl;
// mongo::BSONObj query = mongo::fromjson("{'$text' : {'$search': 'success'}}");

auto_ptr<DBClientCursor> cursor = db.query("wiki.categories", mongo::Query(), 0, 0, &query);//db_wiki.categories.find({ "$text" : { "$search": AND_phrase } },{ "score": { "$meta": "textScore" } })

while (cursor->more())
cout << cursor->next().toString() << endl;
//session->get().runCommand("ide", BSON("text"<<"sems"<<"search"<< value), result);
}

Выход:

{ $search: "success" }
{ $meta: "textScore" }
{ $text: { $search: "success" }, score: { $meta: "textScore" } }

(запрос не совсем такой, как должен в оболочке MongoDB — это должны быть два отдельных объекта JSON)

Ошибка:

{ $err: "Can't canonicalize query: BadValue Unsupported projection option: $text: { $search: "success" }", code: 17287 }

Я также пытался (та же ошибка):

mongo::BSONObj query = mongo::fromjson("{ \"$text\" : { \"$search\": \"success\" } },{ \"score\": { \"$meta\": \"textScore\" } }");
{ $err: "Can't canonicalize query: BadValue Unsupported projection option: 0: { $text: { $search: "success" } }", code: 17287 }

и (опять та же ошибка):

mongo::BSONObj query = mongo::fromjson("{{ \"$text\" : { \"$search\": \"success\" } },{ \"score\": { \"$meta\": \"textScore\" } }}");
{ $err: "Can't canonicalize query: BadValue Unsupported projection option: 0: { $text: { $search: "success" } }", code: 17287 }

и это (опять та же ошибка):

mongo::BSONObj query = mongo::fromjson("[{ \"$text\" : { \"$search\": \"success\" } },{ \"score\": { \"$meta\": \"textScore\" } }]");
{ 0: { $text: { $search: "success" } }, 1: { score: { $meta: "textScore" } } }
{ $err: "Can't canonicalize query: BadValue Unsupported projection option: 0: { $text: { $search: "success" } }", code: 17287 }

Кто-нибудь может помочь? У меня закончились идеи.

0

Решение

Поскольку никто не смотрел на это и, похоже, никто даже не использовал драйвер c ++ для mongodb, мне пришлось самому это выяснить.

Я рад, что попытался использовать драйвер C ++, так как он НАИБОЛЕЕ быстрее, чем PyMongo.

Следующий скрипт запрашивает фразы, найденные в файле input_file.txt, а размер — это количество фраз в файле.

Чтобы выполнить текстовый запрос с оценкой, можно сделать следующее:

void run() {

// input file
ifstream phrases_file("input_file.txt");

// read input file
int size;
phrases_file >> size;
string phrases[size];

if(phrases_file.is_open()){

for(int i = 0; i < size; ++i){
getline(phrases_file, phrases[i]);
trim_right(phrases[i]);
}
}

// connect to the db
mongo::DBClientConnection c;
c.connect("localhost");

// score query
mongo::BSONObj sort_score = mongo::fromjson("{ \"score\": {\"$meta\": \"textScore\"}}");

// sequentially build queries
for(int i = 0; i < size; ++i){
mongo::BSONObjBuilder oB;

stringstream json_text_query_stream;
json_text_query_stream << "{ \"$text\" : {\"$search\": " << "\"" << phrases[i] << "\"" << "}}";
string json_text_query = json_text_query_stream.str();

mongo::BSONObj text_query = mongo::fromjson(json_text_query);

std::auto_ptr<mongo::DBClientCursor> cursor = c.query("wiki.categories", mongo::Query(text_query), 0, 0, &sort_score);

cout << phrases[i] << endl;
while (cursor->more())
std::cout << cursor->next().toString() << std::endl;
std::cout << '\t' << std::endl;
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]