FEATURE: Include participants in PN search data (#16855)

This makes it easier to find PMs involving a particular user, for
example by searching for `in:messages thisUser` (previously, that query
would only return results in posts where `thisUser` was in the post body).
This commit is contained in:
Penar Musaraj 2022-05-18 10:34:01 -04:00 committed by GitHub
parent 96d656f450
commit 71c74a262d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 4 deletions

View File

@ -115,13 +115,13 @@ class SearchIndexer
)
end
def self.update_posts_index(post_id:, topic_title:, category_name:, topic_tags:, cooked:, private_message:)
def self.update_posts_index(post_id:, topic_title:, category_name:, topic_tags:, cooked:, private_message:, allowed_users: nil)
update_index(
table: 'post',
id: post_id,
a_weight: topic_title,
b_weight: category_name,
c_weight: topic_tags,
c_weight: "#{topic_tags} #{allowed_users&.join(" ")}",
# The tsvector resulted from parsing a string can be double the size of
# the original string. Since there is no way to estimate the length of
# the expected tsvector, we limit the input to ~50% of the maximum
@ -231,7 +231,8 @@ class SearchIndexer
category_name: category_name,
topic_tags: tag_names,
cooked: obj.cooked,
private_message: topic.private_message?
private_message: topic.private_message?,
allowed_users: topic.allowed_users.pluck(:username, :name)
)
SearchIndexer.update_topics_index(topic.id, topic.title, obj.cooked) if obj.is_first_post?
@ -254,7 +255,8 @@ class SearchIndexer
category_name: category_name,
topic_tags: tag_names,
cooked: post.cooked,
private_message: obj.private_message?
private_message: obj.private_message?,
allowed_users: obj.allowed_users.pluck(:username, :name)
)
SearchIndexer.update_topics_index(obj.id, obj.title, post.cooked)

View File

@ -291,6 +291,22 @@ describe SearchIndexer do
words = post_search_data.search_data.scan(/'([^']*)'/).map { |match| match[0] }
expect(words).to contain_exactly('best', 'beig', 'obj', 'http', 'titl', 'long', 'enou', 'unca')
end
context 'private messages' do
fab!(:user1) { Fabricate(:user, name: 'bloop', username: 'bloopdroop') }
fab!(:user2) { Fabricate(:user, name: 'two', username: 'twotone') }
let!(:pm_topic) { Fabricate(:private_message_topic,
topic_allowed_users: [
Fabricate.build(:topic_allowed_user, user: user1),
Fabricate.build(:topic_allowed_user, user: user2)
]) }
let(:pm_post) { Fabricate(:post, topic: pm_topic) }
it 'includes participating users in a private message' do
search_data = pm_post.post_search_data.search_data
expect(search_data).to include("bloop", "bloopdroop", "two", "twoton")
end
end
end
describe '.queue_post_reindex' do