123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- # frozen_string_literal: true
- class TagSearchService < BaseService
- def call(query, options = {})
- @query = query.strip.gsub(/\A#/, '')
- @offset = options.delete(:offset).to_i
- @limit = options.delete(:limit).to_i
- @options = options
- results = from_elasticsearch if Chewy.enabled?
- results ||= from_database
- results
- 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,
- },
- },
- },
- {
- match: {
- name: {
- query: @query,
- },
- },
- },
- ],
- },
- }
- definition = TagsIndex.query(query)
- definition = definition.filter(filter) if @options[:exclude_unreviewed]
- definition.limit(@limit).offset(@offset).objects.compact
- rescue Faraday::ConnectionFailed, Parslet::ParseFailed
- nil
- end
- def from_database
- Tag.search_for(@query, @limit, @offset, @options)
- end
- end
|