package search import ( "github.com/blevesearch/bleve/v2" "github.com/blevesearch/bleve/v2/analysis/analyzer/keyword" "github.com/blevesearch/bleve/v2/mapping" "github.com/grafana/grafana/pkg/storage/unified/resource" ) func getBleveMappings(fields resource.SearchableDocumentFields) mapping.IndexMapping { mapper := bleve.NewIndexMapping() mapper.DefaultMapping = getBleveDocMappings(fields) return mapper } func getBleveDocMappings(_ resource.SearchableDocumentFields) *mapping.DocumentMapping { mapper := bleve.NewDocumentStaticMapping() nameMapping := &mapping.FieldMapping{ Analyzer: keyword.Name, Type: "text", Index: true, } mapper.AddFieldMappingsAt(resource.SEARCH_FIELD_NAME, nameMapping) // for filtering/sorting by title full phrase titlePhraseMapping := bleve.NewKeywordFieldMapping() mapper.AddFieldMappingsAt(resource.SEARCH_FIELD_TITLE_PHRASE, titlePhraseMapping) // for searching by title // TODO: do we still need this since we have SEARCH_FIELD_TITLE_PHRASE? titleSearchMapping := bleve.NewTextFieldMapping() mapper.AddFieldMappingsAt(resource.SEARCH_FIELD_TITLE, titleSearchMapping) descriptionMapping := &mapping.FieldMapping{ Name: resource.SEARCH_FIELD_DESCRIPTION, Type: "text", Store: true, Index: true, IncludeTermVectors: false, IncludeInAll: false, DocValues: false, } mapper.AddFieldMappingsAt(resource.SEARCH_FIELD_DESCRIPTION, descriptionMapping) tagsMapping := &mapping.FieldMapping{ Name: resource.SEARCH_FIELD_TAGS, Type: "text", Analyzer: keyword.Name, Store: true, Index: true, IncludeTermVectors: false, IncludeInAll: true, DocValues: false, } mapper.AddFieldMappingsAt(resource.SEARCH_FIELD_TAGS, tagsMapping) folderMapping := &mapping.FieldMapping{ Name: resource.SEARCH_FIELD_FOLDER, Type: "text", Analyzer: keyword.Name, Store: true, Index: true, IncludeTermVectors: false, IncludeInAll: true, DocValues: true, // will be needed for authz client } mapper.AddFieldMappingsAt(resource.SEARCH_FIELD_FOLDER, folderMapping) // Repositories manager := bleve.NewDocumentStaticMapping() manager.AddFieldMappingsAt("kind", &mapping.FieldMapping{ Name: "kind", Type: "text", Analyzer: keyword.Name, Store: true, Index: true, IncludeTermVectors: false, IncludeInAll: true, }) manager.AddFieldMappingsAt("id", &mapping.FieldMapping{ Name: "id", Type: "text", Analyzer: keyword.Name, Store: true, Index: true, IncludeTermVectors: false, IncludeInAll: true, }) source := bleve.NewDocumentStaticMapping() source.AddFieldMappingsAt("path", &mapping.FieldMapping{ Name: "path", Type: "text", Analyzer: keyword.Name, Store: true, Index: true, IncludeTermVectors: false, IncludeInAll: true, }) source.AddFieldMappingsAt("checksum", &mapping.FieldMapping{ Name: "checksum", Type: "text", Analyzer: keyword.Name, Store: true, Index: true, IncludeTermVectors: false, IncludeInAll: true, }) source.AddFieldMappingsAt("timestampMillis", mapping.NewNumericFieldMapping()) mapper.AddSubDocumentMapping("manager", manager) mapper.AddSubDocumentMapping("source", source) labelMapper := bleve.NewDocumentMapping() mapper.AddSubDocumentMapping(resource.SEARCH_FIELD_LABELS, labelMapper) fieldMapper := bleve.NewDocumentMapping() mapper.AddSubDocumentMapping("fields", fieldMapper) return mapper }