Zoekt: Use TotalLineMatchCount / TotalFileMatchCount for accurate result counts
## Background `Gitlab::Search::Zoekt::Response` currently reads `FileMatchCount` and `LineMatchCount` from the coordinating node response for display counts (e.g., "5,000+ results"). These fields reflect the **trimmed** result set — the count of files and line matches actually included in the JSON response after post-sort trimming. The coordinating node also returns `TotalFileMatchCount` and `TotalLineMatchCount`, which are raw Zoekt engine stats representing a lower-bound estimate of total matches across all downstream nodes (independent of result trimming). Once we cap `max_file_match_results`, `FileMatchCount` will reflect the cap (e.g., 20) instead of the true total, making displayed counts incorrect. ## Proposal Update `Gitlab::Search::Zoekt::Response` to use `TotalLineMatchCount` / `TotalFileMatchCount` for display counts: **Key file:** `ee/lib/gitlab/search/zoekt/response.rb` ```ruby # Current: def file_count return result[:FileMatchCount] if result[:FileMatchCount].present? @file_count ||= result['Files']&.count.to_i end def match_count return result[:LineMatchCount] if result[:LineMatchCount].present? @match_count ||= (result['Files']&.sum { |x| x['LineMatches']&.count }).to_i end # Proposed: prefer Total* fields, fall back to current behavior def file_count return result[:TotalFileMatchCount] if result[:TotalFileMatchCount].present? return result[:FileMatchCount] if result[:FileMatchCount].present? @file_count ||= result['Files']&.count.to_i end def match_count return result[:TotalLineMatchCount] if result[:TotalLineMatchCount].present? return result[:LineMatchCount] if result[:LineMatchCount].present? @match_count ||= (result['Files']&.sum { |x| x['LineMatches']&.count }).to_i end ``` ### Rollout This change should be rolled out behind a feature flag (e.g., `zoekt_use_total_match_counts`) to allow gradual rollout and quick rollback.
issue