2015-12-07 2 views
0

Как выполнить полнотекстовый поиск с помощью драйвера 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; 
    } 
} 
Смежные вопросы