2016-08-18 13 views
0

結果はクエリと同じ順序になります。これについてもっと詳しく説明するために、次の例を考えてみましょう。 :クエリElasticsearchの基準のシーケンスに基づいて結果を返します。

私はこのように多少見えIDフィールドを持つ文書、持っている:

{ 
    { 
    "ID": 102, 
    "Name": "Mark" 
    }, 
    { 
    "ID": 104, 
    "Name": "Pete" 
    }, 
    { 
    "ID": 101, 
    "Name": "Su" 
    }, 
    { 
    "ID": 107, 
    "Name": "Kate" 
    }, 
    { 
    "ID": 106, 
    "Name": "Roger" 
    } 
} 

をそして、私のクエリは次のとおりです。

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": 
      { 
      "ID": "101" 
      } 
     }, 
     { 
      "match": 
      { 
      "ID": "104" 
      } 
     }, 
     { 
      "match": 
      { 
      "ID": "107" 
      } 
     }, 
     { 
      "match": 
      { 
      "ID": "102" 
      } 
     }, 
     { 
      "match": 
      { 
      "ID": "106" 
      } 
     } 
     ] 
    } 
    } 
} 

今、私は結果は同じ順序であることを期待してい検索基準として使用します。すなわち:

{ 
    "ID": 101, 
    "Name": "Su" 
}, 
{ 
    "ID": 104, 
    "Name": "Pete" 
}, 
{ 
    "ID": 107, 
    "Name": "Kate" 
}, 
{ 
    "ID": 102, 
    "Name": "Mark" 
}, 
{ 
    "ID": 106, 
    "Name": "Roger" 
} 

これを行う方法を見つけようとしています。それも可能ですか? 助けていただければ幸いです。

答えて

0

私はあなただけのクエリやフィルタを使用してこの種のスコアリングの仕組みを達成できるとは思わない。

あなたのクエリビルダがクエリをビルドするときに、どのようにそれらのIDがコードに入ってくるのかがわかります。ドキュメントを並べ替える順序と同じ順序で来ますか?

「はい」の場合は、機能スコアまたはスクリプトベースのスコアリングロジックでクエリを育てることをお勧めします。 groovy sandboxまたはmvelを使用することができます。

Scripting in elasticsearch.

Function score in elastic

{ 
    "query": {"filtered": { 
    "query": {"function_score": { 
     "query": {"match_all": {}}, 
     "functions": [ 
     {"script_score": { 
      "params": { 
      "id_list":[103,105,109,101] 
      }, 
      "script": " id_list.length -id_list.indexOf(doc['id'].value)" 
     }} 
     ] 
    }} 
    }} 
} 
を使用すると、機能スコア内のスクリプトのスコアのためのparamsとして結果を返すようにしたいのと同じ順序で含まれているIDを持つ配列構造を供給するようにそれについて考えてみよう。 文書のIDを比較した後、各文書にArray.size - indexのスコアを割り当てます。 これはあなたの問題をかなり解決すると思います。具体的な解決策ではありません。回避策はありません。

注意 - 私のクラスタはインラインスクリプトを実行できるように設定されています。デフォルトのスクリプト言語はjavascriptに設定されています。この方法に従えば、クラスタ構成も調べなければならないかもしれません。

+0

お世話になりました! 私たちはこのスクリプトを避けることにしたので、今すぐこの試みを試すことはできますが... しかし、誰かがmultisearchを使ってそれを行うように提案しました...もしmultisearchが動作しないなら、私は必ずこれを試してみてください。 もう一度お返事ありがとう! –

+0

確かに、multisearchがほんの少ししか機能しない場合は、私と他の人のために働いている答えを親切に更新してください。ありがとう – user3775217

関連する問題