code.gitea.io/gitea@v1.22.3/modules/indexer/internal/bleve/indexer.go (about) 1 // Copyright 2023 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package bleve 5 6 import ( 7 "context" 8 "fmt" 9 10 "code.gitea.io/gitea/modules/indexer/internal" 11 "code.gitea.io/gitea/modules/log" 12 13 "github.com/blevesearch/bleve/v2" 14 "github.com/blevesearch/bleve/v2/mapping" 15 "github.com/ethantkoenig/rupture" 16 ) 17 18 var _ internal.Indexer = &Indexer{} 19 20 // Indexer represents a basic bleve indexer implementation 21 type Indexer struct { 22 Indexer bleve.Index 23 24 indexDir string 25 version int 26 mappingGetter MappingGetter 27 } 28 29 type MappingGetter func() (mapping.IndexMapping, error) 30 31 func NewIndexer(indexDir string, version int, mappingGetter func() (mapping.IndexMapping, error)) *Indexer { 32 return &Indexer{ 33 indexDir: indexDir, 34 version: version, 35 mappingGetter: mappingGetter, 36 } 37 } 38 39 // Init initializes the indexer 40 func (i *Indexer) Init(_ context.Context) (bool, error) { 41 if i == nil { 42 return false, fmt.Errorf("cannot init nil indexer") 43 } 44 45 if i.Indexer != nil { 46 return false, fmt.Errorf("indexer is already initialized") 47 } 48 49 indexer, version, err := openIndexer(i.indexDir, i.version) 50 if err != nil { 51 return false, err 52 } 53 if indexer != nil { 54 i.Indexer = indexer 55 return true, nil 56 } 57 58 if version != 0 { 59 log.Warn("Found older bleve index with version %d, Gitea will remove it and rebuild", version) 60 } 61 62 indexMapping, err := i.mappingGetter() 63 if err != nil { 64 return false, err 65 } 66 67 indexer, err = bleve.New(i.indexDir, indexMapping) 68 if err != nil { 69 return false, err 70 } 71 72 if err = rupture.WriteIndexMetadata(i.indexDir, &rupture.IndexMetadata{ 73 Version: i.version, 74 }); err != nil { 75 return false, err 76 } 77 78 i.Indexer = indexer 79 80 return false, nil 81 } 82 83 // Ping checks if the indexer is available 84 func (i *Indexer) Ping(_ context.Context) error { 85 if i == nil { 86 return fmt.Errorf("cannot ping nil indexer") 87 } 88 if i.Indexer == nil { 89 return fmt.Errorf("indexer is not initialized") 90 } 91 return nil 92 } 93 94 func (i *Indexer) Close() { 95 if i == nil || i.Indexer == nil { 96 return 97 } 98 99 if err := i.Indexer.Close(); err != nil { 100 log.Error("Failed to close bleve indexer in %q: %v", i.indexDir, err) 101 } 102 i.Indexer = nil 103 }