chinwagsocial/app/services/tag_search_service.rb

83 lines
1.5 KiB
Ruby

# frozen_string_literal: true
class TagSearchService < BaseService
def call(query, options = {})
@query = query.strip.gsub(/\A#/, '')
@offset = options[:offset].to_i
@limit = options[:limit].to_i
if Chewy.enabled?
from_elasticsearch
else
from_database
end
end
private
def from_elasticsearch
query = {
function_score: {
query: {
multi_match: {
query: @query,
fields: %w(name.edge_ngram name),
type: 'most_fields',
operator: 'and',
},
},
functions: [
{
field_value_factor: {
field: 'usage',
modifier: 'log2p',
missing: 0,
},
},
{
gauss: {
last_status_at: {
scale: '7d',
offset: '14d',
decay: 0.5,
},
},
},
],
boost_mode: 'multiply',
},
}
filter = {
bool: {
should: [
{
term: {
reviewed: {
value: true,
},
},
},
{
term: {
name: {
value: @query,
},
},
},
],
},
}
TagsIndex.query(query).filter(filter).limit(@limit).offset(@offset).objects.compact
end
def from_database
Tag.search_for(@query, @limit, @offset)
end
end