// Copyright 2016 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package indexer import ( "os" "strconv" "code.gitea.io/gitea/modules/setting" "github.com/blevesearch/bleve" "github.com/blevesearch/bleve/analysis/token/unicodenorm" "github.com/blevesearch/bleve/index/upsidedown" "github.com/blevesearch/bleve/mapping" "github.com/blevesearch/bleve/search/query" "github.com/ethantkoenig/rupture" ) // indexerID a bleve-compatible unique identifier for an integer id func indexerID(id int64) string { return strconv.FormatInt(id, 36) } // numericEqualityQuery a numeric equality query for the given value and field func numericEqualityQuery(value int64, field string) *query.NumericRangeQuery { f := float64(value) tru := true q := bleve.NewNumericRangeInclusiveQuery(&f, &f, &tru, &tru) q.SetField(field) return q } const unicodeNormalizeName = "unicodeNormalize" func addUnicodeNormalizeTokenFilter(m *mapping.IndexMappingImpl) error { return m.AddCustomTokenFilter(unicodeNormalizeName, map[string]interface{}{ "type": unicodenorm.Name, "form": unicodenorm.NFC, }) } const maxBatchSize = 16 // openIndexer open the index at the specified path, checking for metadata // updates and bleve version updates. If index needs to be created (or // re-created), returns (nil, nil) func openIndexer(path string, latestVersion int) (bleve.Index, error) { _, err := os.Stat(setting.Indexer.IssuePath) if err != nil && os.IsNotExist(err) { return nil, nil } else if err != nil { return nil, err } metadata, err := rupture.ReadIndexMetadata(path) if err != nil { return nil, err } if metadata.Version < latestVersion { // the indexer is using a previous version, so we should delete it and // re-populate return nil, os.RemoveAll(path) } index, err := bleve.Open(path) if err != nil && err == upsidedown.IncompatibleVersion { // the indexer was built with a previous version of bleve, so we should // delete it and re-populate return nil, os.RemoveAll(path) } else if err != nil { return nil, err } return index, nil }