0

1 つのクエリで複数のインデックスを検索しようとしていますが、インデックスの 1 つに存在するフィールドにのみガウス減衰関数を適用します。

これをelasticsearch-api gemで実行していますが、その部分は問題なく動作します。

これが私がマーベルで実行しているクエリです。

GET episodes,shows,keywords/_search?explain
{
"query": {
  "function_score": {
    "query": {
      "multi_match": {
        "query": "AWESOME SAUCE",
        "type": "most_fields",
        "fields": [ "title", "summary", "show_title"]
      }
    },
    "functions": [
      { "boost_factor":  2 },
      {
        "gauss": {
          "published_at": {
            "scale": "4w"
          }
        }
      }
    ],
  "score_mode": "multiply"
  }
},
  "highlight": {
  "pre_tags": ["<span class='highlight'>"],
  "post_tags": ["</span>"],
  "fields": {
    "summary": {},
    "title": {},
    "description": {}
   }
 }
}

このクエリは、gauss func が魔法のように動作するための published_at フィールドを持っているため、エピソード インデックスに最適です。ただし、すべてのインデックスで実行すると、番組とキーワードでは失敗します (エピソードでは引き続き成功します)。

published_at フィールドが存在する場合、または単一のエピソード インデックスで条件付きガウス減衰関数を実行することは可能ですか?

別の方法 (つまり、インデックスごとに個別のクエリを実行してから結果をマージする) を検討したいと思っていますが、パフォーマンスの点では単一のクエリが最適であると考えました。

ありがとう!

4

2 に答える 2

1

これらのガウス減衰関数をドキュメントのサブセットにのみ適用するフィルターを追加できます。

{
  "filter": {
    "exists": {
      "field": "published_at"
    }
  }
  "gauss": {
    "published_at": {
      "scale": "4w"
    }
  }
}

フィールドを持たないドキュメントの場合、スコア 0 を返すことができます。

{
  "filter": {
    "missing": {
      "field": "published_at"
    }
  }
  "script_score": {
    "script": "0"
  }
}
于 2015-11-06T14:06:19.377 に答える