69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| class AccountSuggestions::SimilarProfilesSource < AccountSuggestions::Source
 | |
|   class QueryBuilder < AccountSearchService::QueryBuilder
 | |
|     def must_clauses
 | |
|       [
 | |
|         {
 | |
|           more_like_this: {
 | |
|             fields: %w(text text.stemmed),
 | |
|             like: @query.map { |id| { _index: 'accounts', _id: id } },
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         {
 | |
|           term: {
 | |
|             properties: 'discoverable',
 | |
|           },
 | |
|         },
 | |
|       ]
 | |
|     end
 | |
| 
 | |
|     def must_not_clauses
 | |
|       [
 | |
|         {
 | |
|           terms: {
 | |
|             id: following_ids,
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         {
 | |
|           term: {
 | |
|             properties: 'bot',
 | |
|           },
 | |
|         },
 | |
|       ]
 | |
|     end
 | |
| 
 | |
|     def should_clauses
 | |
|       {
 | |
|         term: {
 | |
|           properties: {
 | |
|             value: 'verified',
 | |
|             boost: 2,
 | |
|           },
 | |
|         },
 | |
|       }
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def get(account, limit: DEFAULT_LIMIT)
 | |
|     recently_followed_account_ids = account.active_relationships.recent.limit(5).pluck(:target_account_id)
 | |
| 
 | |
|     if Chewy.enabled? && !recently_followed_account_ids.empty?
 | |
|       ids_from_es = QueryBuilder.new(recently_followed_account_ids, account).build.limit(limit).hits.pluck('_id').map(&:to_i)
 | |
|       base_account_scope(account).where(id: ids_from_es).pluck(:id).zip([key].cycle)
 | |
|     else
 | |
|       []
 | |
|     end
 | |
|   rescue Faraday::ConnectionFailed
 | |
|     []
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def key
 | |
|     :similar_to_recently_followed
 | |
|   end
 | |
| end
 |