2017-06-26 6 views
0

かなり複雑なクエリがあり、いくつかの基準を満たす文書を増やしたいと思っています。私は次の単純化された文書構造を持っており、id、genre、tagに基づいていくつかの文書にブーストを与えようとしています。私が何をしたいか個々の文書をどのように昇格するか

{ 
    "id": 123, 
    "genres": ["ACTION", "DRAMA"], 
    "tags": ["For kids", "Romantic", "Nature"] 
} 

は、例えば

id: 123 boost: 5 
genres: ACTION boost: 3 
tags: Romantic boost: 0.2 

で、私のクエリに含まれているすべての文書を後押しし、基準を満たすが、私はそれらをフィルタリングする必要はありません。だから、クエリ節約ブーストは私が推測するどんな助けでもありません。

編集:私が達成したいことを理解しやすいようにするには(elasticsearchで可能かどうかわからない、有効な答えもありません)。

私はクエリで検索し、結果セットを取得したいと思います。このセットでは、いくつかの文書を増やしたいと思います。しかし、私は結果セットを拡大したりフィルタしたりしたくありません。ブーストはクエリから独立している必要があります。

たとえば、特定のタグを検索し、結果セットでカテゴリ 'ACTION'を持つすべてのドキュメントを強調したいとします。しかし、結果セットに 'ACTION'というカテゴリのすべてのドキュメントが必要なわけではなく、特定のタグとカテゴリ 'ACTION'を持つドキュメントだけを望んでいません。

+0

それは回答までにおだった場合、あなたはそれを受け入れてくださいだろうか?ありがとうございました。 – tukan

+0

それは私ではありませんでした。 :) –

+0

私は参照してください。あなたの編集に基づいて答えを更新しようとしましたが、これは完全に理解できませんでした。 – tukan

答えて

0

私は解決策を発見し、それはかなり簡単でした。私は追加クエリを使用します。私は今では異なるブースティング基準を入れ子にして、元のクエリは基本クエリになりました。例えば

https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-boosting-query.html

{ 
    "query": { 
    "boosting": { 
     "positive": { 
     "boosting": { 
      "positive": { 
      "match": { 
       "director": "Spielberg" 
      } 
      }, 
      "negative": { 
      "term": { 
       "genres": "DRAMA" 
      } 
      }, 
      "negative_boost": 1.3 
     } 
     }, 
     "negative": { 
     "term": { 
      "tags": "Romantic" 
     } 
     }, 
     "negative_boost": 1.2 
    } 
    } 
} 
2

私はクエリ時間中に動的ブースティングをする必要があると思います。

最初のidタイトルはboostで、もう1つは 'genders' ACTIONと一致します。

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "title": { 
       "query": "id", 
       "boost": 5 
      } 
      } 
     }, 
     { 
      "match": { 
      "content": "Action" 
      } 
     } 
     ] 
    } 
    } 
} 

あなたのクエリに基づいてmulti_match試合をしたい場合:

{ 
    "multi_match" : { 
    "query": "some query terms here", 
    "fields": [ "id^5", "genders^3", "tags^0.2" ] 
    } 
} 

注:^ 5つの手段は、タイトルを後押しします。

編集:

best_fields

(デフォルト): はたぶん、あなたはESリファレンスガイドから(少なくともES 5.xの)multi_matchクエリの種類ごとに求めている任意のフィールドに一致するドキュメントを検索しますが、 の_scoreを最善のフィールドから使用します。 best_fieldsを参照してください。

most_fields

は、任意のフィールドに一致するドキュメントを検索し、 各フィールドから_scoreを兼ね備えています。 most_fieldsを参照してください。

cross_fields同じアナライザで

トリートフィールド彼らは一つの大きな フィールドであるかのように。任意のフィールドの各単語を検索します。 cross_fieldsを参照してください。

フレーズ

は、各フィールドにmatch_phraseのクエリを実行し、 各フィールドから_scoreを兼ね備えています。 phraseとphrase_prefixを参照してください。

phrase_prefix

は、各フィールドにmatch_phrase_prefixのクエリを実行し、各フィールドから_score を兼ね備えています。 phraseとphrase_prefixを参照してください。で

より:ES 5.4 ElasticSearch reference

+0

しかし、これも私の結果セットを拡大します。たとえば、私はいくつかのタグを検索し、このタグとカテゴリー 'ACTION'ですべての文書を強調したいと思いますが、カテゴリー 'ACTION'のすべての文書を望んでいないので、タグANDカテゴリ 'ACTION' 。この場合、どちらも助けてはいけません。 –

+0

@Peter答えには2つの部分があります。実際に 'multi_match'を試しましたか?これは個々のフィールドを向上させます。参考文献で詳細を読むことができます - https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html#_literal_fields_literal_and_per_field_boosting – tukan

関連する問題