Skip to content
Snippets Groups Projects
Commit 2f77f864 authored by Mateus Rambo Strey's avatar Mateus Rambo Strey
Browse files

Merge branch 'new_search' into populator

parents 31307bb4 65e844f0
No related branches found
No related tags found
1 merge request!320Populator merge
module SearchService
SEARCH_CLASSES = %w(LearningObject Collection User)
SEARCH_CLASSES = %w(LearningObject Collection User).freeze
class InvalidSearchError < StandardError; end
def self.search(search, user, results = true)
def self.search(search, user)
model = instance(search, user)
results ? model.search.results : model.search
model.search.results
end
def self.autocomplete(search, user)
......
module SearchService
class LearningObject < Model
def search
::LearningObject.search(@search.query, where: where_hash, order: order_hash, page: @search.page, per_page: @search.results_per_page)
p "BUSCA"
p mount_query
::LearningObject.includes([:license, :tags, :taggings, :publisher, :language]).search(query: mount_query, order: order_hash, page: @search.page, per_page: @search.results_per_page)
end
def autocomplete
......@@ -16,12 +18,16 @@ module SearchService
private
def where_hash
hash = {}
hash[:tags] = @search.tags unless @search.tags.blank?
hash[:object_type] = @search.types unless @search.types.blank?
hash[:state] = validate_object
hash.blank? ? nil : hash
def search_fields
[:name, :description, :author, :object_type]
end
def mount_filter
filter = []
filter << { in: { tags: @search.tags } } unless @search.tags.blank?
filter << { in: { object_type: @search.types } } unless @search.types.blank?
filter << { term: { state: validate_object } }
filter
end
def order_hash
......@@ -30,7 +36,6 @@ module SearchService
when 'publicationasc' then { published_at: { order: :asc, unmapped_type: :timestamp } }
when 'publicationdesc' then { published_at: { order: :desc, unmapped_type: :timestamp } }
when 'title' then { name: { order: :asc, unmapped_type: :string } }
else { score: { order: :desc, unmapped_type: :integer } }
end
end
......
......@@ -31,5 +31,48 @@ module SearchService
}
end
end
def search_fields
[]
end
def mount_query
{
function_score: {
query: { bool: {
must: { dis_max: { queries: mount_queries } },
filter: mount_filter
} },
functions: [{ script_score: { script: { lang: 'groovy', file: 'calculate_score' } } }]
}
}
end
def mount_queries
search_fields.map do |field|
[
{ match: { "#{field}.word_start" => {
query: @search.query,
boost: 10,
operator: 'and',
analyzer: 'searchkick_word_search'
} } },
{ match: { "#{field}.word_start" => {
query: @search.query,
boost: 1,
operator: 'and',
analyzer: 'searchkick_word_search',
fuzziness: 1,
prefix_length: 0,
max_expansions: 3,
fuzzy_transpositions: true
} } }
]
end.flatten
end
def mount_filter
[]
end
end
end
module SearchService
class User < Model
def search
::User.search(@search.query, order: order_hash, page: @search.page, per_page: @search.results_per_page)
::User.search(query: mount_query, order: order_hash, page: @search.page, per_page: @search.results_per_page)
end
def autocomplete
......@@ -14,9 +14,13 @@ module SearchService
private
def search_fields
[:name]
end
def order_hash
return { name: { order: :asc, unmapped_type: :string } } if @search.order == 'title'
{ score: { order: :desc, unmapped_type: :integer } }
nil
end
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment