1

Description I have just migrated our application from searchkick to meilisearch however meilisearch doesn't have a way I can search for single term across multiple indexes or models like searchkick does.

Basic example I want to to be able to search my term on at least one model

example

Meilisearch.search(term, models: [...index_names])
Kofi Asare
  • 97
  • 1
  • 5

1 Answers1

0

Here is a workaround using parallel gem

# search.rb

module Queries
  class Search < BaseQuery
    include SearchHelper
    
    type [Types::SearchResultsType], null: true
    argument :query, String, required: true
    argument :models, [String], required: true, default_value: ['AppUser']

    def resolve(**args)
      search(args)
    end
  end
end


# search_helper.rb

module SearchHelper
  SEARCH_MODELS = %w[AppUser Market Organisation]

  def search(args)
    raise Errors::SearchError::BlankQueryError if args[:query].blank?
    raise Errors::SearchError::UnpermittedQueryError if args[:query] == '*'

    models = args[:models].map { |m| m.tr(' ', '').camelize }
    if models.difference(SEARCH_MODELS).any?
      raise Errors::SearchError::UnknownSearchModelError
    end

    Parallel.flat_map(models, in_threads: models.size) do |m|
      m.constantize.search(args[:query])
    end
  end
end

# search_results_type

module Types
  class SearchResultsType < Types::BaseUnion
    description 'Models which may be searched on'
    possible_types(
      Types::AppUserType,
      Types::MarketType,
      Types::OrganisationType,
    )

    def self.resolve_type(object, context)
      if object.is_a?(AppUser)
        Types::AppUserType
      elsif object.is_a?(Market)
        Types::MarketType
      else
        Types::OrganisationType
      end
    end
  end
end

Graphql query

{
  search(query: "Gh", models: ["Market","Organisation"]) {
    ... on Market {
      id
      name
    }
    ... on Organisation {
      id
      name
    }
    
    ... on AppUser {
      id
      email
    }
  }
}
Kofi Asare
  • 97
  • 1
  • 5