about summary refs log tree commit diff
path: root/app/models
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2018-02-09 23:04:47 +0100
committerGitHub <noreply@github.com>2018-02-09 23:04:47 +0100
commit3ebc0ad4d3c2fe0b0951a334642b769bd521a799 (patch)
tree9b88b2da41dbbc24cb922660937b5ee65366c38d /app/models
parent235c14c79d620d47012a08425324df222a136457 (diff)
Full-text search for authorized statuses (#6423)
* Add full-text search for authorized statuses

- Search API will return statuses that match the query
- Only for logged in users
- Only if you are author of the status,
- Or you were mentioned in it
- Or you favourited or reblogged it
- Configuration over `ES_ENABLED`, `ES_HOST`, `ES_PORT`, `ES_PREFIX`
- Run `rails chewy:deploy` to create & populate index

Fix #5880
Fix #4293
Fix #1152

* Add commented out docker-compose configuration for ES container

* Optimize index import, filter search results

* Add basic normalization to the index

* Add better stemming and normalization to the index

* Skip webfinger request if search query includes both @ and a space

* Fix code style

* Visually separate search result sections

* Fix code style issues
Diffstat (limited to 'app/models')
-rw-r--r--app/models/favourite.rb2
-rw-r--r--app/models/status.rb18
2 files changed, 20 insertions, 0 deletions
diff --git a/app/models/favourite.rb b/app/models/favourite.rb
index 2b1271f31..fa1884b86 100644
--- a/app/models/favourite.rb
+++ b/app/models/favourite.rb
@@ -13,6 +13,8 @@
 class Favourite < ApplicationRecord
   include Paginable
 
+  update_index('statuses#status', :status) if Chewy.enabled?
+
   belongs_to :account, inverse_of: :favourites
   belongs_to :status,  inverse_of: :favourites, counter_cache: true
 
diff --git a/app/models/status.rb b/app/models/status.rb
index 26ff40bf7..0de89ad4e 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -31,6 +31,8 @@ class Status < ApplicationRecord
   include Cacheable
   include StatusThreadingConcern
 
+  update_index('statuses#status', :proper) if Chewy.enabled?
+
   enum visibility: [:public, :unlisted, :private, :direct], _suffix: :visibility
 
   belongs_to :application, class_name: 'Doorkeeper::Application', optional: true
@@ -78,6 +80,22 @@ class Status < ApplicationRecord
 
   delegate :domain, to: :account, prefix: true
 
+  def searchable_by(preloaded = nil)
+    ids = [account_id]
+
+    if preloaded.nil?
+      ids += mentions.pluck(:account_id)
+      ids += favourites.pluck(:account_id)
+      ids += reblogs.pluck(:account_id)
+    else
+      ids += preloaded.mentions[id] || []
+      ids += preloaded.favourites[id] || []
+      ids += preloaded.reblogs[id] || []
+    end
+
+    ids.uniq
+  end
+
   def reply?
     !in_reply_to_id.nil? || attributes['reply']
   end