2016-06-21 9 views
1

私は弾性検索で異なるタイプのインデックスを作成しました。 しかし、一部の選択されたタイプで結果を向上させたい場合は、どうすればよいですか? クエリを追加する際にタイプフィルタを使用できますが、タイプフィルタを使用すると、フィルタで使用できるタイプは1つだけです。私は、複数のタイプに基づいて結果を高める必要があります。elasticsearchで選択したタイプに基づいて結果をブーストする

例: 人物、場所、イベントが自分のタイプである人物、イベント、ロケーションデータが弾性検索でインデックスされています。

私はすべてのタイプでキーワード 'ロンドン'を探していますが、人とイベントタイプのレコードをロケーションよりも増強したいと思います。

どのように私は同じ達成することができますか?

答えて

0

所望の機能性を得るための方法の一つは、ブールクエリ内でクエリをラップすることですし、その後

小さな例を特定の文書を後押しするためにすべき句を使用します

POST test/person 
{ 
    "title": "london elise moore" 
} 

POST test/event 
{ 
    "title" : "london is a great city" 
} 
ブーストなし

GET test/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "title": "london" 
      } 
     } 
     ] 
    } 
    } 
} 

次の応答に

"hits": { 
    "total": 2, 
    "max_score": 0.2972674, 
    "hits": [ 
     { 
     "_index": "test", 
     "_type": "person", 
     "_id": "AVVx621GYvUb9aQn6r5X", 
     "_score": 0.2972674, 
     "_source": { 
      "title": "london elise moore" 
     } 
     }, 
     { 
     "_index": "test", 
     "_type": "event", 
     "_id": "AVVx63LrYvUb9aQn6r5Y", 
     "_score": 0.26010898, 
     "_source": { 
      "title": "london is a great city" 
     } 
     } 
    ] 
    } 

そして今、追加すべき句で:

GET test/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "title": "london" 
      } 
     } 
     ], 
     "should": [ 
     { 
      "term": { 
      "_type": { 
       "value": "event", 
       "boost": 2 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

次の応答が戻っています:場合

"hits": { 
    "total": 2, 
    "max_score": 1.0326607, 
    "hits": [ 
     { 
     "_index": "test", 
     "_type": "event", 
     "_id": "AVVx63LrYvUb9aQn6r5Y", 
     "_score": 1.0326607, 
     "_source": { 
      "title": "london is a great city" 
     } 
     }, 
     { 
     "_index": "test", 
     "_type": "person", 
     "_id": "AVVx621GYvUb9aQn6r5X", 
     "_score": 0.04235228, 
     "_source": { 
      "title": "london elise moore" 
     } 
     } 
    ] 
    } 

あなたもすべき句、原因で余分なブーストを残すことができますそれは結果をブーストします一致する必要があります:)

これは役立ちます!

+0

ありがとうByron。はい、Should句は結果を上げることができます。しかし、既存のクエリを変更したくないので、フィルタで同じものを使用したいのですが、選択したESタイプに応じて結果を増やすフィルタを追加します。出来ますか?はいの場合は、どうですか? – user3340357

+0

フィルタを使用するだけでその機能を利用する方法はありません。フィルタは結果セットを絞り込みますが、特定のドキュメントを増やすためのものではありません。誰かがこれについてのアイデアを持っているかどうかは分かりません。 あなたはより良い代替案を考え出すことができるようにクエリを投稿できますか? –

0

私はそれが、両方を使用すると、機能スコアを使用して

POST c1_1/_search 
{ 
    "from": 0, 
    "size": 10, 
    "sort": [ 
    { 
     "_script": { 
     "order": "desc", 
     "type": "number", 
     "script": "double boost = 1; if(doc['_type'].value == 'Person') { boost *= 2 }; if(doc['_type'].value == 'Event') { boost *= 3}; return _score * boost; ", 
     "params": {} 
     } 
    }, 
    { 
     "_score": {} 
    } 
    ], 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "query_string": { 
      "query": "*", 
      "default_operator": "and" 
      } 
     } 
     ], 
     "minimum_should_match": "1" 
    } 
    } 
} 

2番目のオプションをソート使用してスクリプトに 1を使用していることをやっての二つの方法を参照してください。

POST c1_1/_search 
{ 
    "from": 0, 
    "size": 10, 
    "query": { 
    "function_score": { 
     "query": { 
     "bool": { 
      "should": [ 
      { 
       "query_string": { 
       "query": "*", 
       "default_operator": "and" 
       } 
      } 
      ], 
      "minimum_should_match": "1" 
     } 
     }, 
     "script_score": { 
     "script": "_score * (doc['_type'].value == 'Person' || doc['_type'].value == 'Event'? 2 : 1)" 
     } 
    } 
    } 
} 
関連する問題