module Elasticsearch::Git::Repository::ClassMethods
Public Instance Methods
search_blob(query, type: :all, page: 1, per: 20, options: {})
click to toggle source
# File lib/elasticsearch/git/repository.rb, line 457 def search_blob(query, type: :all, page: 1, per: 20, options: {}) page ||= 1 query_hash = { query: { filtered: { query: { match: { 'blob.content' => { query: "#{query}", operator: :and } } } } }, facets: { languageFacet: { terms: { field: :language, all_terms: true, size: 20 } }, blobRepositoryFaset: { terms: { field: :rid, all_terms: true, size: repositories_count } } }, size: per, from: per * (page - 1) } if options[:repository_id] query_hash[:query][:filtered][:filter] ||= { and: [] } query_hash[:query][:filtered][:filter][:and] << { terms: { "blob.rid" => [options[:repository_id]].flatten } } end if options[:language] query_hash[:query][:filtered][:filter] ||= { and: [] } query_hash[:query][:filtered][:filter][:and] << { terms: { "blob.language" => [options[:language]].flatten } } end options[:order] = :default if options[:order].blank? order = case options[:order].to_sym when :recently_indexed { _timestamp: { order: :desc, mode: :min } } when :last_indexed { _timestamp: { order: :asc, mode: :min } } else {} end query_hash[:sort] = order.blank? ? [:_score] : [order, :_score] if options[:highlight] query_hash[:highlight] = { pre_tags: ["gitlabelasticsearch→"], post_tags: ["←gitlabelasticsearch"], fields: { "blob.content" => {}, "type" => "fvh", "boundary_chars" => "\n" } } end res = self.__elasticsearch__.search(query_hash) { results: res.results, total_count: res.size, languages: res.response["facets"]["languageFacet"]["terms"], repositories: res.response["facets"]["blobRepositoryFaset"]["terms"] } end
search_commit(query, page: 1, per: 20, options: {})
click to toggle source
# File lib/elasticsearch/git/repository.rb, line 380 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: { filtered: { query: { multi_match: { fields: fields, query: "#{query}", operator: :or } }, }, }, facets: { commitRepositoryFaset: { terms: { field: "commit.rid", all_terms: true, size: repositories_count } } }, size: per, from: per * (page - 1) } if query.blank? query_hash[:query][:filtered][:query] = { match_all: {}} query_hash[:track_scores] = true end if options[:repository_id] query_hash[:query][:filtered][:filter] ||= { and: [] } query_hash[:query][:filtered][:filter][:and] << { terms: { "commit.rid" => [options[:repository_id]].flatten } } 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? order = case options[:order].to_sym when :recently_indexed { _timestamp: { order: :desc, mode: :min } } when :last_indexed { _timestamp: { order: :asc, mode: :min } } else {} end query_hash[:sort] = order.blank? ? [:_score] : [order, :_score] res = self.__elasticsearch__.search(query_hash) { results: res.results, total_count: res.size, repositories: res.response["facets"]["commitRepositoryFaset"]["terms"] } end
search_file_names(query, page: 1, per: 20, options: {})
click to toggle source
# File lib/elasticsearch/git/repository.rb, line 545 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