1

ElasticSearch クエリをデバッグしようとしています。問題のあるクエリの説明を有効にしました。これは、クエリが合計を行う必要がある中間スコアの積を行っていることを示しています。(elastic4s を使用してクエリ リクエストを作成しています。)

問題は、生成されたクエリが実際に何であるかがわからないことです。バグがelastic4s (クエリ要求を正しく生成していない) にあるのか、コードにあるのか、elasticsearch にあるのかを判断したいと考えています。そのため、次のコードを使用して、テストで使用される組み込みの Elasticsearch インスタンスのログを有効にしました。

ESLoggerFactory.setDefaultFactory(new Slf4jESLoggerFactory())
val settings = Settings.settingsBuilder
  .put("path.data", dataDirPath)
  .put("path.home", "/var/elastic/")
  .put("cluster.name", clusterName)
  .put("http.enabled", httpEnabled)
  .put("index.number_of_shards", 1)
  .put("index.number_of_replicas", 0)
  .put("discovery.zen.ping.multicast.enabled", false)
  .put("index.refresh_interval", "10ms")
  .put("script.engine.groovy.inline.search", true)
  .put("script.engine.groovy.inline.update", true)
  .put("script.engine.groovy.inline.mapping", true)
  .put("index.search.slowlog.threshold.query.debug", "0s")
  .put("index.search.slowlog.threshold.fetch.debug", "0s")
  .build

しかし、logback.xml で構成されたログ ファイルに記録されているクエリが見つかりません。実際のクエリではなく、elasticsearch からの他のログ メッセージがそこに表示されます。

4

2 に答える 2

1

Elastic4s の特定のケースでは、elastic4s クエリ オブジェクトを呼び出して、JSON-over-HTTP プロトコルを使用してリクエストを送信した場合にリクエストの JSON 本文部分を生成する機能を提供します (ほとんどのタイプ).show。リクエストの。これは、たとえば、すべての ES 検索クエリを生成する 1 つのメソッドがある場合など、コード内の便利なポイントでログに記録できます。もちろん、偽の JSON を生成する Elasticsearch のコードにはまだバグがある可能性があるため、完全に信頼する必要はありません。ただし、HTTP を介して実際の Elasticsearch クラスターに対して Sense を使用した出力で問題を再現することを試みる価値があります。可能であれば、(a) それが Elastic4s のバグではないことを知っており、(b) JSON を簡単に操作して試すことができます。問題の原因を突き止めます。.show

showtoStringそのため、プレーンな Elasticsearch API またはその上に別の JVM ベースのラッパーを使用して、それを呼び出して、ログに記録する JSON 文字列を取得できます。

組み込みの Elasticsearch を使用すると、これはロギングに関して得られるものと同じくらい良好です。ただし、ビルダーの呼び出しにブレークポイントを設定し、作成された実際の Java Elasticsearch 要求オブジェクトを観察することを除きます (これが最も正確な方法です)。

于 2016-11-11T21:31:09.853 に答える
1

少なくとも直接ではなく、少なくとも現在利用可能な ES バージョンではできません。これはかなり長い間議論されてきたものです (例: https://github.com/elastic/elasticsearch/issues/9172およびhttps://github.com/elastic/elasticsearch/issues/12187 )。これはすぐに変更される可能性があります。 、タスク API の書き直しを伴います。それまでの間、ES Restlog ( https://github.com/etsy/es-restlog ) などを使用したり、ES の前に nginx を配置して nginx ログにクエリをキャプチャしたりできます。tcpdump を使用することもできます (例:tcpdump -vvv -x -X -i any port 9200)、サーバー上で実行されているクエリをキャプチャします。最後のオプションの 1 つは、アプリケーションを変更し、クエリを実行する代わりにエコーすることです (クエリ自体は JSON であるため、クエリを実行する前に ES 自体にクエリを挿入します)。

于 2016-11-11T21:06:26.217 に答える