124 lines
3.8 KiB
Go
124 lines
3.8 KiB
Go
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
|
|
}
|