2017-01-14 9 views
1

Я пытаюсь реализовать полнотекстовый поиск с помощью mongodb 3.4, nodejs и socket.io с четкой и сортировкой. До сих пор так хорошо, у меня есть этот код, который работает хорошо, но без сортировки части:Полнотекстовый поиск в MongoDB и NodeJS с сортировкой текста в разных значениях

socket.on('searchProductName', function (data) { 
    MongoClient.connect(config.database.url, function (err, db) { 
     db.collection(config.database.collection.products).distinct('productName', 
     { 
      $text: {$search: data}}, {score: {$meta: "textScore"} 
     }, 
     function (err, doc) { 
      socket.emit('searchProductNameResults', doc); 
      db.close(); 
     }); 

    }); 
}); 

Я пытаюсь найти способ, чтобы использовать этот метод, основанный на textScore сортировки, но и для различных значений:

db.collection.find(
    <query>, 
    { score: { $meta: "textScore" } } 
).sort({ score: { $meta: "textScore" } }) 

Любые идеи?

Спасибо

+0

'db.collection.find ({ $ text: {$ search: "dogs"}}, {score: {$ meta: "toextScore"}}). sort ({score: {$ meta: "textScore"}}) 'и создайте индекс, подобный этому' db .collection.createIndex ({"key": "text", "content": "text"}) ' –

ответ

1

Используйте функцию aggregate() в рамках агрегации, чтобы воспользоваться text search within the $match, $sort и $group операторов трубопроводов, которые помогут вам достичь желаемого результата .

Возьмем, например, следующий конвейер, который использует оператор $match в качестве начального этапа и включает в себя операцию $text. Оценка может быть частью спецификации трубопровода в $sort и предыдущий конвейер, $group создает различные значения, упорядоченные по оценкам, используя $addToSet оператора:

socket.on('searchProductName', function (data) { 
    MongoClient.connect(config.database.url, function (err, db) { 
     var pipeline = [ 
      { 
       "$match": { 
        "$text": { 
         "$search": data 
        } 
       } 
      }, 
      { "$sort": { "score": { "$meta": "textScore" } } }, 
      { 
       "$group": { 
        "_id": null, 
        "products": { "$addToSet": "$productName" }      
       } 
      } 
     ]; 
     db.collection(config.database.collection.products) 
      .aggregate(pipeline, function (err, docs) { 
       socket.emit('searchProductNameResults', docs[0].products); 
       db.close(); 
      } 
     ); 

    }); 
}); 
+0

Пожалуйста, помогите мне: http://stackoverflow.com/questions/43434299/mongodb-full-text-search- как к применить-экстра-conditions' – jones