3

このクエリは、実行されるたびに 200 ミリ秒以上かかります。

{
  "filter": {
    "term": {
      "id": "123456",
      "_cache": true
    }
  }
}

ただし、これは最初のクエリの後に実行されるたびに 2 ~ 3 ミリ秒しかかかりません。

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "id": "123456"
        }
      }
    }
  }
}

両方のクエリで同じ ID 値に注意してください。2 番目のクエリは、最初のクエリのキャッシュされた結果を使用しているようです。しかし、最初のクエリがキャッシュされた結果自体を使用できないのはなぜでしょうか? 最初のクエリから削除"_cache" : trueしても何も変わりません。

そして、他のIDで2番目のクエリを実行すると、最初に実行するのに約40ミリ秒かかり、その後は毎回2〜3ミリ秒かかります。したがって、2 番目のクエリは高速に動作するだけでなく、結果をキャッシュし、後続の呼び出しにキャッシュを使用します。

このすべての説明はありますか?

4

1 に答える 1

5

最初のリクエストの最上位filter要素は、Elasticsearch で非常に特別な機能を持っています。ファセットに影響を与えずに検索結果をフィルタリングするために使用されます。ファセットへの干渉を避けるために、このフィルターは検索時ではなく結果の収集時に適用され、パフォーマンスが低下します。ファセットなしで最上位レベルを使用filterすることはほとんど意味がfilteredありません。これは、constant_scoreクエリが通常より優れたパフォーマンスを提供するためです。filteredクエリの冗長性がmatch_all気になる場合は、2 番目のリクエストを同等のconstant_scoreクエリに書き直すことができます。

{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "id": "123456"
        }
      }
    }
  }
}
于 2012-12-23T03:14:43.727 に答える