module Elasticsearch::Git::Repository::ClassMethods
Public Instance Methods
search(query, type: :all, page: 1, per: 20, options: {})
click to toggle source
# File lib/elasticsearch/git/repository.rb, line 395 def search(query, type: :all, page: 1, per: 20, options: {}) results = { blobs: [], commits: []} case type.to_sym when :all results[:blobs] = search_blob(query, page: page, per: per, options: options) results[:commits] = search_commit(query, page: page, per: per, options: options) when :blob results[:blobs] = search_blob(query, page: page, per: per, options: options) when :commit results[:commits] = search_commit(query, page: page, per: per, options: options) end results end
search_blob(query, type: :all, page: 1, per: 20, options: {})
click to toggle source
# File lib/elasticsearch/git/repository.rb, line 474 def search_blob(query, type: :all, page: 1, per: 20, options: {}) page ||= 1 query_hash = { query: { bool: { must: { simple_query_string: { query: query, default_operator: :and, fields: [ 'blob.content', 'blob.file_name' ] } } } }, size: per, from: per * (page - 1) } query_hash[:query][:bool][:filter] = [] if options[:repository_id] query_hash[:query][:bool][:filter] << { terms: { 'blob.rid' => [options[:repository_id]].flatten } } end if options[:additional_filter] query_hash[:query][:bool][:filter] ||= [] query_hash[:query][:bool][:filter] << options[:additional_filter] end if options[:language] query_hash[:query][:bool][:filter] << { terms: { 'blob.language' => [options[:language]].flatten } } end options[:order] = :default if options[:order].blank? query_hash[:sort] = [:_score] if options[:highlight] query_hash[:highlight] = { pre_tags: ["gitlabelasticsearch→"], post_tags: ["←gitlabelasticsearch"], order: "score", fields: { "blob.content" => {}, "blob.file_name" => {}, } } end res = self.__elasticsearch__.search(query_hash) { results: res.results, total_count: res.size } end
search_commit(query, page: 1, per: 20, options: {})
click to toggle source
# File lib/elasticsearch/git/repository.rb, line 411 def search_commit(query, page: 1, per: 20, options: {}) page ||= 1 fields = %w(message^10 sha^5 author.name^2 author.email^2 committer.name committer.email).map {|i| "commit.#{i}"} query_hash = { query: { bool: { must: [{ simple_query_string: { fields: fields, query: query, default_operator: :or } }] } }, size: per, from: per * (page - 1) } if query.blank? query_hash[:query][:bool][:must] = { match_all: {}} query_hash[:track_scores] = true end if options[:repository_id] query_hash[:query][:bool][:filter] = { terms: { 'commit.rid' => [options[:repository_id]].flatten } } end if options[:additional_filter] query_hash[:query][:bool][:filter] ||= [] query_hash[:query][:bool][:filter] << options[:additional_filter] end if options[:highlight] es_fields = fields.map { |field| field.split('^').first }.inject({}) do |memo, field| memo[field.to_sym] = {} memo end query_hash[:highlight] = { pre_tags: ["gitlabelasticsearch→"], post_tags: ["←gitlabelasticsearch"], fields: es_fields } end options[:order] = :default if options[:order].blank? query_hash[:sort] = [:_score] res = self.__elasticsearch__.search(query_hash) { results: res.results, total_count: res.size } end
search_file_names(query, page: 1, per: 20, options: {})
click to toggle source
# File lib/elasticsearch/git/repository.rb, line 540 def search_file_names(query, page: 1, per: 20, options: {}) query_hash = { fields: ['blob.path'], query: { fuzzy: { 'repository.blob.path' => { value: query } }, }, filter: { term: { 'repository.blob.rid' => [options[:repository_id]].flatten } }, size: per, from: per * (page - 1) } self.__elasticsearch__.search(query_hash) end