2017-12-28 15 views
1

I以下のブールクエリがあります。私が渡した結果の優先順位をつけるにはどうしたらいいですか?

POST _search 
{ 
    "query": { 
    "bool" : { 
     "must" : { 
     "term" : { "title" : "technology" } 
     }, 
     "should" : [ 
     { "term" : { "text" : "companies that produce hardware" } } 
     ] 
    } 
    } 
} 

が、これは(順番に)以下の文書idを返すと仮定します。このクエリは、私は別のデータベースを照会し、次のような結果を得ることが起こる前に

1. netflix 
2. google 
3. microsoft 
4. dell 
5. intel 

を(順番に):

1. intel 
2. amazon 
3. dell 

次の結果が得られるように、私はelasticsearchのデータベースよりも結果を優先したいと考えています。

1. intel 
2. dell 
3. netflix 
4. google 
5. microsoft 

(私たちは空中からelasticsearchドキュメントを作成しようとしていないので、Amazonが表示されないことに注意してください)。

答えて

1

script based sortingを使用すると、カスタムスクリプトに基づいてデータを並べ替えることができます。

各結果に優先度の値を割り当てるスクリプトを使用します。私はそれが可能だとしても、落胆している「_id」フィールドでソートするのでcompanyフィールドを使用

{ 
    "query": { 
    "bool" : { 
     "must" : { 
     "term" : { "title" : "technology" } 
     }, 
     "should" : [ 
     { "term" : { "text" : "companies that produce hardware" } } 
     ] 
    } 
    }, 
    "sort": { 
    "_script": { 
     "type": "number", 
     "order": "asc", 
     "script": { 
     "lang": "painless", 
     "source": "if (doc['company'].value.equals('intel')) return 0; 
        else if (doc['company'].value.equals('amazon')) return 1;       
        else if (doc['company'].value.equals('dell')) return 2;       
        else return 3; 
     } 
    } 
    } 
} 

: のようなものだろう。 this linkをチェックしてください。

Sorting,ScriptingおよびPainlessを確認してください。

希望すると助かります!

+0

スイッチとは何ですか? 「会社」とは何ですか?代わりに "id"を使うことができますか? –

+0

「else return 3」は残りのドキュメントをそのままにしますか?例えば、残りのドキュメントの並べ替えを混乱させることはありませんか? –

+0

@MarissaLevy Nevermind、私は答えからswitch文の部分を削除しました。 このスクリプトでは、ドキュメントの内容は変更されず、この特定のクエリでの結果の並べ替えにのみ影響します。私はESソーティングのドキュメントへのリンクを追加しました。 "else return 3"は、ドキュメントが 'if文'のいずれにも当てはまらない場合、その優先順位値が最も高く、最後に配置されることを保証します。 「_id」フィールドについての情報を追加しました:) – YoavBZ

関連する問題