feat: improve matching of multiple keywords Resolves: https://codeberg.org/alanpearce/searchix/issues/5
2 files changed, 20 insertions(+), 4 deletions(-)
changed files
M internal/index/indexer.go → internal/index/indexer.go
@@ -19,6 +19,7 @@ "alin.ovh/x/log" "go.uber.org/zap" "github.com/blevesearch/bleve/v2" + "github.com/blevesearch/bleve/v2/analysis" "github.com/blevesearch/bleve/v2/analysis/analyzer/custom" "github.com/blevesearch/bleve/v2/analysis/analyzer/keyword" "github.com/blevesearch/bleve/v2/analysis/analyzer/simple"@@ -30,9 +31,11 @@ "github.com/blevesearch/bleve/v2/analysis/tokenizer/letter" "github.com/blevesearch/bleve/v2/analysis/tokenizer/unicode" "github.com/blevesearch/bleve/v2/document" "github.com/blevesearch/bleve/v2/mapping" - indexAPI "github.com/blevesearch/bleve_index_api" + index "github.com/blevesearch/bleve_index_api" "gitlab.com/tozd/go/errors" ) + +var idAnalyzer analysis.Analyzer type Options struct { LowMemory bool@@ -170,6 +173,8 @@ packageMapping.AddFieldMappingsAt("Programs", identityFieldMapping) indexMapping.AddDocumentMapping("option", optionMapping) indexMapping.AddDocumentMapping("package", packageMapping) + + idAnalyzer = indexMapping.AnalyzerNamed("c_name") return indexMapping, nil }@@ -360,11 +365,17 @@ errs <- errors.WithMessage(err, "could not store object in search index") continue } - field := document.NewTextFieldWithIndexingOptions("_data", nil, data.Bytes(), indexAPI.StoreField) - newDoc := doc.AddField(field) + field := document.NewTextFieldWithIndexingOptions("_data", nil, data.Bytes(), index.StoreField) + doc.AddField(field) + idField := document.NewTextFieldCustom( + "_id", nil, []byte(doc.ID()), + index.IndexField|index.StoreField|index.IncludeTermVectors, + idAnalyzer, + ) + doc.AddField(idField) // log.Debug("adding object to index", "name", opt.Name) - if err := batch.IndexAdvanced(newDoc); err != nil { + if err := batch.IndexAdvanced(doc); err != nil { errs <- errors.WithMessagef(err, "could not index object %s", obj.GetName()) continue
M internal/index/search.go → internal/index/search.go
@@ -147,6 +147,11 @@ query.AddShould(q) } + idQuery := bleve.NewMatchQuery(keyword) + idQuery.SetField("_id") + idQuery.SetBoost(8) + query.AddShould(idQuery) + mainProgramQuery := bleve.NewMatchQuery(keyword) mainProgramQuery.SetField("MainProgram") mainProgramQuery.SetBoost(10)