200 万のドキュメントのインデックスを作成しましたが、一致するすべてのドキュメント ID を一度に返そうとしています。私はPHPクライアントを使用しています。
私のマッピングは次のとおりです。
$params = [
'index' => $index,
'body' => [
'settings' => [
"number_of_shards" => 1,
"number_of_replicas" => 0,
"index.queries.cache.enabled" => false,
"index.soft_deletes.enabled" => false,
"index.refresh_interval" => -1,
"index.requests.cache.enable" => false,
"index.max_result_window"=> $result_window
],
'mappings' => [
'_source' => [
"enabled" => false
],
'properties' => [
"text" => [
"type" => "text",
"index_options" => "docs"
]
]
]
]
];
私のクエリ文字列は次のとおりです。
$json = '{
"from" : 0, "size" : '.$size.',
"profile": true,
"query": {
"bool": {
"filter" : {
"match" : {
"text" : {
"query" : "justin trump clinton harry",
"operator" : "and"
}
}
}
}
}
}';
私のプロファイル API の出力は次のとおりです。
Array
(
[shards] => Array
(
[0] => Array
(
[id] => [tod2gbVKSRGinZVfdXTmxA][elasticindex-2][0]
[searches] => Array
(
[0] => Array
(
[query] => Array
(
[0] => Array
(
[type] => BoostQuery
[description] => (ConstantScore(+text:justin +text:trump +text:clinton +text:harry))^0.0
[time_in_nanos] => 176108294
[breakdown] => Array
(
[set_min_competitive_score_count] => 0
[match_count] => 0
[shallow_advance_count] => 0
[set_min_competitive_score] => 0
[next_doc] => 158666901
[match] => 0
[next_doc_count] => 439522
[score_count] => 439522
[compute_max_score_count] => 0
[compute_max_score] => 0
[advance] => 262234
[advance_count] => 1
[score] => 14477781
[build_scorer_count] => 2
[create_weight] => 401058
[shallow_advance] => 0
[create_weight_count] => 1
[build_scorer] => 1421272
)
[children] => Array
(
[0] => Array
(
[type] => BooleanQuery
[description] => +text:justin +text:trump +text:clinton +text:harry
[time_in_nanos] => 128547273
[breakdown] => Array
(
[set_min_competitive_score_count] => 0
[match_count] => 0
[shallow_advance_count] => 0
[set_min_competitive_score] => 0
[next_doc] => 126071813
[match] => 0
[next_doc_count] => 439522
[score_count] => 0
[compute_max_score_count] => 0
[compute_max_score] => 0
[advance] => 260695
[advance_count] => 1
[score] => 0
[build_scorer_count] => 2
[create_weight] => 373620
[shallow_advance] => 0
[create_weight_count] => 1
[build_scorer] => 1401619
)
[children] => Array
(
[0] => Array
(
[type] => TermQuery
[description] => text:justin
[time_in_nanos] => 40691947
)
[1] => Array
(
[type] => TermQuery
[description] => text:trump
[time_in_nanos] => 42972729
)
[2] => Array
(
[type] => TermQuery
[description] => text:clinton
[time_in_nanos] => 29407195
)
[3] => Array
(
[type] => TermQuery
[description] => text:harry
[time_in_nanos] => 33799904
)
)
)
)
)
)
[rewrite_time] => 260704
[collector] => Array
(
[0] => Array
(
[name] => SimpleTopScoreDocCollector
[reason] => search_top_hits
[time_in_nanos] => 116380511
)
)
)
)
)
)
)
目標は、一致するすべてのドキュメントを一度に取得することです。ドキュメント ID のみが必要なので (指定された用語がドキュメントに存在するかどうかのみを確認します)、index_options をドキュメントとして使用しました。スクロール API については理解していますが、max_result_window を使用したいです。私はシャードを 1 つだけ使用し、レプリカは使用していません。また、検索操作を実行するときにドキュメントのスコアリングを回避しました。
私の質問は次のとおりです。
ドキュメント ID のみを取得し、ドキュメントのフェッチ フェーズを回避したいので、ソース フィールドを無効にしました。他のメタデータを回避するために、このリンクに従って "stored_fields": " none ", "docvalue_fields": ["_id"] を試し、フェッチ フェーズを回避しました。ただし、ドキュメントの種類とインデックス名は引き続き表示されます。ドキュメント ID のみを取得し、フェッチ フェーズを回避するために必要なことはありますか?
一致するすべてのドキュメントを取得しているので、スコアリングは私には関係ないので、フィルター句を使用しましたが、以下のプロファイル API の結果でなぜブーストクエリのタイミングが得られるのか疑問に思っていました。しかし、Booleanquery スコアのタイミングがゼロであることにも注意してください!
ブール クエリ検索が Lucene インデックスだけでどれくらいの時間を要したかを知るには、ブール クエリによって報告された時間を取るべきですか、それともすべての子 (ターム クエリ) のタイミングを合計する必要がありますか? これらすべての用語クエリのタイミングを追加すると、ブールクエリによって報告されたものよりも高いためです。これについて考えられる理由はありますか?
ブールクエリのタイミングのためにコレクターも含める必要がありますか?プロファイル api では、「Lucene は、トラバーサル、スコアリング、および一致するドキュメントのコレクションの調整を担当する「コレクター」を定義することによって機能すると言われています。」. また、「コレクターの時間はクエリの時間とは独立していることに注意してください。それらは独立して計算、結合、および正規化されます! Lucene の実行の性質上、コレクターの時間を「マージ」することは不可能です。クエリ セクションなので、それらは別々の部分に表示されます。」私の理解では、Lucene インデックスの投稿リストを走査してブール クエリ操作を実行するのに役立ちます。この点で私は正しいですか?
Elasticsearch でインデックス作成時間を調査するための同様の API はありますか? 設定 API でインデックス作成時間を取得できましたが、プロファイル API に似たものを探していますか?