From 1d2220141e51253eaadf724ad559bd708f9f68ed Mon Sep 17 00:00:00 2001 From: Miguel de la Cruz Date: Fri, 18 Sep 2020 10:49:56 +0200 Subject: [PATCH] [MM-26420] Adds wildcard support to Bleve (#14885) --- services/searchengine/bleveengine/search.go | 21 ++++++++++--- store/searchtest/post_layer.go | 35 ++++++++++++++------- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/services/searchengine/bleveengine/search.go b/services/searchengine/bleveengine/search.go index 4512b628fc..73759416f8 100644 --- a/services/searchengine/bleveengine/search.go +++ b/services/searchengine/bleveengine/search.go @@ -159,10 +159,23 @@ func (b *BleveEngine) SearchPosts(channels *model.ChannelList, searchParams []*m } } else { if len(params.Terms) > 0 { - messageQ := bleve.NewMatchQuery(params.Terms) - messageQ.SetField("Message") - messageQ.SetOperator(termOperator) - termQueries = append(termQueries, messageQ) + terms := []string{} + for _, term := range strings.Split(params.Terms, " ") { + if strings.HasSuffix(term, "*") { + messageQ := bleve.NewWildcardQuery(term) + messageQ.SetField("Message") + termQueries = append(termQueries, messageQ) + } else { + terms = append(terms, term) + } + } + + if len(terms) > 0 { + messageQ := bleve.NewMatchQuery(strings.Join(terms, " ")) + messageQ.SetField("Message") + messageQ.SetOperator(termOperator) + termQueries = append(termQueries, messageQ) + } } if len(params.ExcludedTerms) > 0 { diff --git a/store/searchtest/post_layer.go b/store/searchtest/post_layer.go index 0b336afb9a..4c20ad987d 100644 --- a/store/searchtest/post_layer.go +++ b/store/searchtest/post_layer.go @@ -116,7 +116,7 @@ var searchPostStoreTests = []searchTest{ { Name: "Should support search with wildcards", Fn: testSupportWildcards, - Tags: []string{ENGINE_POSTGRES, ENGINE_MYSQL, ENGINE_ELASTICSEARCH}, + Tags: []string{ENGINE_ALL}, }, { Name: "Should not support search with preceding wildcards", @@ -126,7 +126,7 @@ var searchPostStoreTests = []searchTest{ { Name: "Should discard a wildcard if it's not placed immediately by text", Fn: testSearchDiscardWildcardAlone, - Tags: []string{ENGINE_POSTGRES, ENGINE_MYSQL, ENGINE_ELASTICSEARCH}, + Tags: []string{ENGINE_ALL}, }, { Name: "Should support terms with dash", @@ -1025,21 +1025,34 @@ func testSupportStemming(t *testing.T, th *SearchTestHelper) { func testSupportWildcards(t *testing.T, th *SearchTestHelper) { p1, err := th.createPost(th.User.Id, th.ChannelBasic.Id, "search post", "", model.POST_DEFAULT, 0, false) require.Nil(t, err) - p2, err := th.createPost(th.User.Id, th.ChannelBasic.Id, "searching post", "", model.POST_DEFAULT, 0, false) + p2, err := th.createPost(th.User.Id, th.ChannelBasic.Id, "searching", "", model.POST_DEFAULT, 0, false) require.Nil(t, err) _, err = th.createPost(th.User.Id, th.ChannelBasic.Id, "another post", "", model.POST_DEFAULT, 0, false) require.Nil(t, err) defer th.deleteUserPosts(th.User.Id) - params := &model.SearchParams{ - Terms: "search*", - } - results, apperr := th.Store.Post().SearchPostsInTeamForUser([]*model.SearchParams{params}, th.User.Id, th.Team.Id, 0, 20) - require.Nil(t, apperr) + t.Run("Simple wildcard-only search", func(t *testing.T) { + params := &model.SearchParams{ + Terms: "search*", + } + results, apperr := th.Store.Post().SearchPostsInTeamForUser([]*model.SearchParams{params}, th.User.Id, th.Team.Id, 0, 20) + require.Nil(t, apperr) - require.Len(t, results.Posts, 2) - th.checkPostInSearchResults(t, p1.Id, results.Posts) - th.checkPostInSearchResults(t, p2.Id, results.Posts) + require.Len(t, results.Posts, 2) + th.checkPostInSearchResults(t, p1.Id, results.Posts) + th.checkPostInSearchResults(t, p2.Id, results.Posts) + }) + + t.Run("Wildcard search with another term placed after", func(t *testing.T) { + params := &model.SearchParams{ + Terms: "sear* post", + } + results, apperr := th.Store.Post().SearchPostsInTeamForUser([]*model.SearchParams{params}, th.User.Id, th.Team.Id, 0, 20) + require.Nil(t, apperr) + + require.Len(t, results.Posts, 1) + th.checkPostInSearchResults(t, p1.Id, results.Posts) + }) } func testNotSupportPrecedingWildcards(t *testing.T, th *SearchTestHelper) {