32 lines
805 B
Ruby
32 lines
805 B
Ruby
# frozen_string_literal: true
|
|
|
|
module DiscourseAi
|
|
module Embeddings
|
|
class SemanticSearch
|
|
def initialize(guardian, model)
|
|
@guardian = guardian
|
|
@model = model
|
|
end
|
|
|
|
def search_for_topics(query, page = 1)
|
|
limit = Search.per_filter + 1
|
|
offset = (page - 1) * Search.per_filter
|
|
|
|
candidate_ids =
|
|
DiscourseAi::Embeddings::Topic.new.asymmetric_semantic_search(model, query, limit, offset)
|
|
|
|
::Post
|
|
.where(post_type: ::Topic.visible_post_types(guardian.user))
|
|
.public_posts
|
|
.where("topics.visible")
|
|
.where(topic_id: candidate_ids, post_number: 1)
|
|
.order("array_position(ARRAY#{candidate_ids}, topic_id)")
|
|
end
|
|
|
|
private
|
|
|
|
attr_reader :model, :guardian
|
|
end
|
|
end
|
|
end
|