0
{
  "query": {
    "custom_score": {
      "query": {
        "match": {
          "xxx": {
            "query": "foobar"
          }
        }
      },
      "filter": {
        "and": [
          {
            "query": {
              "match": {
                "yyyy": {
                  "query": "barfoo"
                }
              }
            }
          }
        ]
      }
    },
    "script": "_score * doc['_score']"
  }
}

これによりエラーが発生します

 [custom_score] query does not support [filter]

それでは、そのようなクエリをどのように評価するのでしょうか?

4

1 に答える 1

1

現在のスクリプトはあまり意味がないため、ブーストに関する要件を確認することをお勧めします。

また、elasticsearch query DSLのドキュメントもご覧ください。複合クエリと単純なクエリのいずれかを提供し、これらを組み合わせることができます。エラーが示すように、カスタム スコア クエリ内にフィルターを配置することはできません。カスタム スコア クエリ内でフィルター処理されたクエリを使用することもできます。

{
  "query": {
    "custom_score": {
      "query": {
        "filtered" : {
          "query" : {
            "match": {
              "xxx": {
                "query": "foobar"
              }
            }
          },
          "filter" : {
            "and": [
              {
                "query": {
                  "match": {
                    "yyyy": {
                      "query": "barfoo"
                    }
                  }
                }
              }
            ]
          }
        }
      },
      "script": "_score * doc['_score']"
    }
  }
}

または、次のような最上位フィルターを使用します。

{
  "query": {
    "custom_score": {
      "query": {
        "match": {
          "xxx": {
            "query": "foobar"
          }
        }
      },
      "script": "_score * doc['_score']"
    }
  },
  "filter": {
    "and": [
      {
        "query": {
          "match": {
            "yyyy": {
              "query": "barfoo"
            }
          }
        }
      }
    ]
  }
}

2 つのオプションの違いは、検索要求でファセットも作成する場合はトップ レベルのフィルターが考慮されず、フィルターをクエリ内に配置すると考慮されることです。

注目すべきもう 1 つの点: 句が 1 つしかない場合は and フィルターは必要ありません。また、フィルタはキャッシュ可能であり、全文検索が無料でほとんど予測不可能であることを考えると、全文検索をキャッシュするのは無駄になるため、フィルタ内に全文検索を配置することは通常意味がありません。

于 2013-07-05T08:36:03.890 に答える