Skip to content

Commit 95eee88

Browse files
committed
feat: add precise search for elastic engine
1 parent a9decf0 commit 95eee88

File tree

8 files changed

+19
-12
lines changed

8 files changed

+19
-12
lines changed

modules/indexer/code/bleve.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ func (b *BleveIndexer) Delete(repoID int64) error {
280280

281281
// Search searches for files in the specified repo.
282282
// Returns the matching file-paths
283-
func (b *BleveIndexer) Search(repoIDs []int64, language, keyword string, page, pageSize int) (int64, []*SearchResult, []*SearchResultLanguages, error) {
283+
func (b *BleveIndexer) Search(repoIDs []int64, language, keyword string, page, pageSize int, isMatch bool) (int64, []*SearchResult, []*SearchResultLanguages, error) {
284284
phraseQuery := bleve.NewMatchPhraseQuery(keyword)
285285
phraseQuery.FieldVal = "Content"
286286
phraseQuery.Analyzer = repoIndexerAnalyzer

modules/indexer/code/elastic_search.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,13 @@ func extractAggs(searchResult *elastic.SearchResult) []*SearchResultLanguages {
330330
}
331331

332332
// Search searches for codes and language stats by given conditions.
333-
func (b *ElasticSearchIndexer) Search(repoIDs []int64, language, keyword string, page, pageSize int) (int64, []*SearchResult, []*SearchResultLanguages, error) {
334-
kwQuery := elastic.NewMultiMatchQuery(keyword, "content")
333+
func (b *ElasticSearchIndexer) Search(repoIDs []int64, language, keyword string, page, pageSize int, isMatch bool) (int64, []*SearchResult, []*SearchResultLanguages, error) {
334+
searchType := "best_fields"
335+
if isMatch {
336+
searchType = "phrase_prefix"
337+
}
338+
339+
kwQuery := elastic.NewMultiMatchQuery(keyword, "content").Type(searchType)
335340
query := elastic.NewBoolQuery()
336341
query = query.Must(kwQuery)
337342
if len(repoIDs) > 0 {

modules/indexer/code/indexer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ type SearchResultLanguages struct {
4343
type Indexer interface {
4444
Index(repo *models.Repository, sha string, changes *repoChanges) error
4545
Delete(repoID int64) error
46-
Search(repoIDs []int64, language, keyword string, page, pageSize int) (int64, []*SearchResult, []*SearchResultLanguages, error)
46+
Search(repoIDs []int64, language, keyword string, page, pageSize int, isMatch bool) (int64, []*SearchResult, []*SearchResultLanguages, error)
4747
Close()
4848
}
4949

modules/indexer/code/indexer_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func testIndexer(name string, t *testing.T, indexer Indexer) {
6464

6565
for _, kw := range keywords {
6666
t.Run(kw.Keyword, func(t *testing.T) {
67-
total, res, langs, err := indexer.Search(kw.RepoIDs, "", kw.Keyword, 1, 10)
67+
total, res, langs, err := indexer.Search(kw.RepoIDs, "", kw.Keyword, 1, 10, false)
6868
assert.NoError(t, err)
6969
assert.EqualValues(t, len(kw.IDs), total)
7070
assert.EqualValues(t, kw.Langs, len(langs))

modules/indexer/code/search.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,12 @@ func searchResult(result *SearchResult, startIndex, endIndex int) (*Result, erro
106106
}
107107

108108
// PerformSearch perform a search on a repository
109-
func PerformSearch(repoIDs []int64, language, keyword string, page, pageSize int) (int, []*Result, []*SearchResultLanguages, error) {
109+
func PerformSearch(repoIDs []int64, language, keyword string, page, pageSize int, isMatch bool) (int, []*Result, []*SearchResultLanguages, error) {
110110
if len(keyword) == 0 {
111111
return 0, nil, nil, nil
112112
}
113113

114-
total, results, resultLanguages, err := indexer.Search(repoIDs, language, keyword, page, pageSize)
114+
total, results, resultLanguages, err := indexer.Search(repoIDs, language, keyword, page, pageSize, isMatch)
115115
if err != nil {
116116
return 0, nil, nil, err
117117
}

modules/indexer/code/wrapped.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ func (w *wrappedIndexer) Delete(repoID int64) error {
7373
return indexer.Delete(repoID)
7474
}
7575

76-
func (w *wrappedIndexer) Search(repoIDs []int64, language, keyword string, page, pageSize int) (int64, []*SearchResult, []*SearchResultLanguages, error) {
76+
func (w *wrappedIndexer) Search(repoIDs []int64, language, keyword string, page, pageSize int, isMatch bool) (int64, []*SearchResult, []*SearchResultLanguages, error) {
7777
indexer, err := w.get()
7878
if err != nil {
7979
return 0, nil, nil, err
8080
}
81-
return indexer.Search(repoIDs, language, keyword, page, pageSize)
81+
return indexer.Search(repoIDs, language, keyword, page, pageSize, isMatch)
8282

8383
}
8484

routers/home.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ func ExploreCode(ctx *context.Context) {
299299
page = 1
300300
}
301301

302+
isMatch := false
302303
var (
303304
repoIDs []int64
304305
err error
@@ -342,14 +343,14 @@ func ExploreCode(ctx *context.Context) {
342343

343344
ctx.Data["RepoMaps"] = rightRepoMap
344345

345-
total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum)
346+
total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum, isMatch)
346347
if err != nil {
347348
ctx.ServerError("SearchResults", err)
348349
return
349350
}
350351
// if non-login user or isAdmin, no need to check UnitTypeCode
351352
} else if (ctx.User == nil && len(repoIDs) > 0) || isAdmin {
352-
total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum)
353+
total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum, isMatch)
353354
if err != nil {
354355
ctx.ServerError("SearchResults", err)
355356
return

routers/repo/search.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ func Search(ctx *context.Context) {
2828
if page <= 0 {
2929
page = 1
3030
}
31+
isMatch := false
3132
total, searchResults, searchResultLanguages, err := code_indexer.PerformSearch([]int64{ctx.Repo.Repository.ID},
32-
language, keyword, page, setting.UI.RepoSearchPagingNum)
33+
language, keyword, page, setting.UI.RepoSearchPagingNum, isMatch)
3334
if err != nil {
3435
ctx.ServerError("SearchResults", err)
3536
return

0 commit comments

Comments
 (0)