0

Sense ツールを使用して、2 つの非常に単純なクエリを作成します。メソッド (GET または POST) を除いて、クエリは同じです。一度に 1 つのクエリを実行すると、結果は非常に似ていますが、クエリ自体に関連していないように見える点で異なり (take、max_score など)、スコープを大きくするほど類似性が低くなります。

たとえば、これらは私が期待するのと同じ結果を返します。

私のGETクエリ:

GET syslog-*/_search
{
  "size": 5, 
  "query" : {
    "bool": {
      "must":
      {
        "term":{"@hostname":"MyServer"}
      }
    }
  }
}

私の POST クエリ:

POST syslog-*/_search
{
  "size": 5, 
  "query" : {
    "bool": {
      "must":
      {
        "term":{"@hostname":"MyServer"}
      }
    }
  }
}

に変更すると"size": 50、最初は同じですが、出力の約 1/3 でドリフトが始まります。最終的に、PUT に存在するタイムスタンプが GET の結果のどこにも見つからないところまで到達します。のようなものに移動すると"size": 5000、結果が大きく異なるため、これらのクエリから作成されたレポート データの正確性を疑い始めます。

Sense で ELK を使い始めたばかりなので、これは正常な動作である可能性があります。上級開発者は、Sense を使用して Elasticsearch データベースから情報を取得することに関しては、GET と PUT に機能上の違いはないことを保証しますが、私は彼を誤解している可能性があります。いずれにせよ、この質問を投稿して、これを正しく理解しているかどうかを確認したいと思います。

この問題に対処していると思われる別の質問 ( here ) を見つけました。しかし、詳細を読むと、その投稿で受け入れられた回答によると、POST は実際にはボンネットの下の GET であるため、事態はさらに混乱します。

説明は、GET と POST の http メソッドに関するものです。舞台裏では、Sense は実際に GET リクエストを HTTP POST に変換します..GET と書いても、実際の http リクエストは POST です。

4

1 に答える 1

0

他の開発者ともう少し話し、Elasticsearch のドキュメントをさらに掘り下げた後、答えを発見しました。要するに、問題は定義された並べ替え方法の欠如でした。これは、ソートしていないときの動作に関するドキュメントの重要な部分でした:

...一致するドキュメントのみが必要であることを示しています...関連性を判断しようとはしません。ドキュメントは事実上ランダムな順序で返されます...

したがって、GET 対 POST の全体は重要ではありませんでした。サイズが大きくなるほど一貫性のない結果が得られるようになった理由は、クエリが大きくなるにつれて結果が「ランダム」になる可能性が高くなったためです。したがって、これら2つのクエリ(現在は日付でソートされています)...

GET syslog-*/_search
{
  "size": 1000, 
  "query" : {
    "bool": {
      "must":
      {
        "term":{"@hostname":"MyServer"}
      }
    }
  },
   "sort":{"@timestamp":{"order":"desc"}}
}
"hits":{"total":7554334,....

...まったく同じ結果を返します。サイズが 1000 に設定されている場合でも、ヒット カウントは同じであることに注意してください。

POST syslog-*/_search
{
  "size": 1000, 
  "query" : {
    "bool": {
      "must":
      {
        "term":{"@hostname":"MyServer"}
      }
    }
  },
   "sort":{"@timestamp":{"order":"desc"}}
}
"hits":{"total":7554334,....

正気度回復。:D

于 2016-09-06T20:55:45.387 に答える