7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
# File 'app/controllers/ragdoll/api/v1/search_controller.rb', line 7
def search
query = params[:query]
if query.blank?
return render_error("Query parameter is required")
end
begin
search_options = {
limit: params[:limit]&.to_i || 10,
threshold: params[:threshold]&.to_f || 0.7,
use_usage_ranking: params[:use_usage_ranking] == 'true'
}
if params[:document_type].present?
search_options[:document_type] = params[:document_type]
end
if params[:status].present?
search_options[:status] = params[:status]
end
search_response = ::Ragdoll.search(search_options.merge(query: query))
results = search_response.is_a?(Hash) ? search_response[:results] || [] : []
formatted_results = results.map do |result|
if result[:embedding_id] && result[:document_id]
embedding = ::Ragdoll::Embedding.find(result[:embedding_id])
document = ::Ragdoll::Document.find(result[:document_id])
{
embedding_id: result[:embedding_id],
document_id: result[:document_id],
document_title: document.title,
content: result[:content],
similarity: result[:similarity],
usage_count: embedding.usage_count,
last_used_at: embedding.returned_at,
chunk_index: embedding.chunk_index,
document_type: document.document_type
}
end
end.compact
begin
similarities = formatted_results.map { |r| r[:similarity] }.compact
::Ragdoll::Search.create!(
query: query,
search_type: 'api_semantic',
results_count: formatted_results.count,
max_similarity_score: similarities.any? ? similarities.max : nil,
min_similarity_score: similarities.any? ? similarities.min : nil,
avg_similarity_score: similarities.any? ? (similarities.sum / similarities.size.to_f) : nil,
search_filters: search_options.to_json,
search_options: {
api_request: true,
threshold_used: search_options[:threshold]
}.to_json
)
rescue => e
Rails.logger.error "Failed to save API search: #{e.message}"
end
render json: {
query: query,
results: formatted_results,
total_results: formatted_results.count,
search_options: search_options
}
rescue => e
render_error(e.message)
end
end
|