diff --git a/api4/post_test.go b/api4/post_test.go index 1e6e4c5cd4..351139ae27 100644 --- a/api4/post_test.go +++ b/api4/post_test.go @@ -2249,6 +2249,27 @@ func TestSearchHashtagPosts(t *testing.T) { CheckUnauthorizedStatus(t, resp) } +func TestSearchUnderscorePosts(t *testing.T) { + th := Setup(t).InitBasic() + defer th.TearDown() + th.LoginBasic() + Client := th.Client + + message := "test_with_underscore" + assert.NotNil(t, th.CreateMessagePost(message)) + + message = " test with underscore" + assert.NotNil(t, th.CreateMessagePost(message)) + + posts, resp := Client.SearchPosts(th.BasicTeam.Id, "test_with_underscore", false) + CheckNoError(t, resp) + require.Len(t, posts.Order, 1, "wrong search results") + + Client.Logout() + _, resp = Client.SearchPosts(th.BasicTeam.Id, "#sgtitlereview", false) + CheckUnauthorizedStatus(t, resp) +} + func TestSearchPostsInChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() diff --git a/store/searchtest/post_layer.go b/store/searchtest/post_layer.go index f0c4df4a7b..720f58b273 100644 --- a/store/searchtest/post_layer.go +++ b/store/searchtest/post_layer.go @@ -215,7 +215,7 @@ var searchPostStoreTests = []searchTest{ { Name: "Should be able to search terms with underscores", Fn: testSearchTermsWithUnderscores, - Tags: []string{EngineMySql, EngineElasticSearch}, + Tags: []string{EngineAll}, }, { Name: "Should be able to search posts made by bot accounts", diff --git a/store/sqlstore/post_store.go b/store/sqlstore/post_store.go index df1bc00f66..fdcd0543b7 100644 --- a/store/sqlstore/post_store.go +++ b/store/sqlstore/post_store.go @@ -1481,7 +1481,16 @@ func (s *SqlPostStore) search(teamId string, userId string, params *model.Search queryParams["Terms"] = "(" + strings.Join(strings.Fields(terms), " & ") + ")" + excludeClause } - searchClause := fmt.Sprintf("AND to_tsvector('english', %s) @@ to_tsquery('english', :Terms)", searchType) + searchClause := "" + if strings.Contains(terms, "_") { + //Strip quotes off terms with it + if strings.Contains(terms, "\"") { + queryParams["Terms"] = strings.ReplaceAll(queryParams["Terms"].(string), "\"", "") + } + searchClause = fmt.Sprintf("AND lower(%s)::tsvector @@ lower(:Terms)::tsquery", searchType) + } else { + searchClause = fmt.Sprintf("AND to_tsvector('english', %s) @@ to_tsquery('english', :Terms)", searchType) + } searchQuery = strings.Replace(searchQuery, "SEARCH_CLAUSE", searchClause, 1) } else if s.DriverName() == model.DATABASE_DRIVER_MYSQL { if searchType == "Message" {