1

描述 我刚刚将我们的应用程序从 searchkick 迁移到 meilisearch,但是 meilisearch 没有办法像 searchkick 那样跨多个索引或模型搜索单个术语。

基本示例 我希望能够在至少一个模型上搜索我的术语

例子

Meilisearch.search(term, models: [...index_names])
4

1 回答 1

0

这是使用并行 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 查询

{
  search(query: "Gh", models: ["Market","Organisation"]) {
    ... on Market {
      id
      name
    }
    ... on Organisation {
      id
      name
    }
    
    ... on AppUser {
      id
      email
    }
  }
}
于 2022-02-22T01:44:15.823 回答