docbrown/app/services/search/query_builders/query_base.rb
Molly Struve 6ac637b9ef
[deploy] Boost Scores For Adjacent Words (#9562)
* Feature:Boost Scores For Adjacent Words

* using equal for spec array to ensure order
2020-07-30 15:24:11 +02:00

80 lines
1.8 KiB
Ruby

module Search
module QueryBuilders
class QueryBase
attr_accessor :params, :body
def as_hash
@body
end
private
def build_body
@body = ActiveSupport::HashWithIndifferentAccess.new
build_queries
add_sort
set_size
add_highlight_fields
filter_source
end
def add_highlight_fields; end
def filter_source; end
def add_sort
sort_key = @params[:sort_by] || self.class::DEFAULT_PARAMS[:sort_by]
sort_direction = @params[:sort_direction] || self.class::DEFAULT_PARAMS[:sort_direction]
@body[:sort] = {
sort_key => sort_direction
}
end
def set_size
# By default we will return 0 documents if size is not specified
@body[:size] = @params[:size] || self.class::DEFAULT_PARAMS[:size]
end
def query_keys_present?
self.class::QUERY_KEYS.detect { |key, _| @params[key].present? }
end
def query_conditions
self.class::QUERY_KEYS.filter_map do |query_key, query_fields|
next if @params[query_key].blank?
fields = query_fields.presence || [query_key]
query_hash(@params[query_key], fields)
end
end
def match_phrase_conditions
self.class::QUERY_KEYS.filter_map do |query_key, _fields|
next if @params[query_key].blank?
match_phrase(@params[query_key], query_key)
end
end
def match_phrase(phrase, query_key)
{
match_phrase: {
query_key => { query: phrase, slop: 0 }
}
}
end
def query_hash(key, fields)
{
simple_query_string: {
query: "#{key}*",
fields: fields,
lenient: true,
analyze_wildcard: true
}
}
end
end
end
end