2016-10-16 16 views
1

F3でこのような答えをどうやって使うのですか?全文検索とスコアソートMongoDB

php mongodb full-text search and sort

EDIT: 私はタイトルと説明で検索しています。 searchtermがない場合は、フィールドcreated_atでソートされます。 の場合は、最も関連性の高いものを並べ替えます。

編集:編集: また、ページ付けプラグインも使用しています。

+0

はS.I @ –

+0

...もう少し説明しよう。私はタイトルと説明で検索しています。 searchtermがなければ 'created_at'フィールドをソートします。もし_ **が** _ searchtermの場合は:最も関連性の高いものを並べ替えます。 – anned20

+0

「最も関連性が高い」を定義します。スコアリングはどこでもまったく同じではありません。 –

答えて

3

を、あなたができるようになります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、スコアフィールドを投影し$projectオペレータのパイプラインが続く検索語と一致します$matchパイプライン動作を行うことにより、最も関連性の高いテキストスコアを有する文書を、得るために、その後、最も関連性の高い項目を返すには別の$orderパイプライン操作を実行します。 「textScore」metadataが、その後の予測、種類、および条件$text操作が含ま$matchのステージのために提供されています:フレームワークのedgeバージョンを使用して

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

あなたの答えをありがとう!私はこれのようにそれを使用する方法を知っています。私の質問は、どのように私はこれをFat Free Frameworkで使うのですか?あなたの助けをありがとう – anned20