描述 我刚刚将我们的应用程序从 searchkick 迁移到 meilisearch,但是 meilisearch 没有办法像 searchkick 那样跨多个索引或模型搜索单个术语。
基本示例 我希望能够在至少一个模型上搜索我的术语
例子
Meilisearch.search(term, models: [...index_names])
描述 我刚刚将我们的应用程序从 searchkick 迁移到 meilisearch,但是 meilisearch 没有办法像 searchkick 那样跨多个索引或模型搜索单个术语。
基本示例 我希望能够在至少一个模型上搜索我的术语
例子
Meilisearch.search(term, models: [...index_names])
这是使用并行 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
}
}
}