2016-10-16 7 views
1

Как я могу использовать ответ, подобный этому в F3?Полнотекстовый поиск и оценка сортировки MongoDB

php mongodb full-text search and sort

EDIT: Я ищу в названии и описании. Если нет поискового сервера, он будет сортировать по полю created_at. Если там is a searchterm однако: сортируйте его по наиболее актуальным.

EDIT: EDIT: Я также использую плагин для разбивки на страницы, если это имеет значение.

+0

Попытка объяснить немного больше .. –

+0

@ S.I. Я ищу в заголовке и описании. Если нет searchterm, он будет сортировать по полю 'created_at'. Если там _ ** есть ** _ searchterm: сортируйте его по наиболее актуальным. – anned20

+0

Определите «наиболее релевантные». Оценка не совсем одинакова во всем мире. –

ответ

3

Использование версии рамок edge, вы будете в состоянии определить проецируемое поле с именем score и использовать его для сортировки.

например:

// MongoDB instance 
$db=new DB\Mongo('localhost:27017','mydb'); 

// Define a `score` field here 
$fields=['score'=>['$meta'=>'textScore']]; 

// Mapper instance 
$mapper=new DB\Mongo\Mapper($db,'mycollection',$fields); 

// Search text and sort by score 
$mapper->load(
    ['$text'=>['$search'=>'search text']], 
    ['order'=>['score'=>['$meta'=>'textScore']]] 
); 
+0

Как я могу использовать это с помощью: [Pagination] (https://github.com/ikkez/F3-Sugar/tree/master-v3/Pagination)? – anned20

+0

Ну, цитируется из [docs] (https://github.com/ikkez/F3-Sugar/tree/master-v3/Pagination#3-paginate-your-records): '$ subset = $ mapper-> paginate ($ page-1, $ limit, $ filter, $ options); '. В вашем случае: '$ filter = ['$ search' => 'search text']]' и '$ options = ['order' => ['score' => ['$ meta' => 'textScore «]]]'. – xfra35

+0

Спасибо! Попробуй, когда я вернусь домой. Выглядит многообещающе! – anned20

1

Используйте aggregation framework, чтобы получить документы, которые имеют наиболее релевантные оценки текста, выполнив операцию трубопровода $match который будет соответствовать поисковому запросу, а затем с помощью $project оператора трубопровода, который проецирует поля оценки, а затем выполните еще $order операция трубопровода, чтобы вернуть наиболее подходящий элемент. «TextScore» metadata доступен для проекций, видов и условий последующих этапа $match, который включает в себя операцию $text:

db.collection.aggregate([ 
    { 
     "$match": { 
       "$text": { 
        "$search": "search text" 
       } 
     } 
    }, 
    { 
     "$project": { 
       "_id": 0, 
       "score": { 
        "$meta": "textScore" 
       } 
      } 
    }, 
    { 
      "$orderby": { 
       "score" : -1 
       } 
    } 
]) 
+0

Спасибо за ваш ответ! Я знаю, как это использовать. Мой вопрос: как я могу использовать это в Fat Free Framework. Спасибо за вашу помощь. – anned20

Смежные вопросы