Skip to content
Snippets Groups Projects
Select Git revision
  • 2ffe1832e533653f15fdeedfb932d32050fd8a84
  • master default protected
  • feature/PRXS-NotifyAttachment
  • feature/PRXS-3156-SaveRevision
  • PRXS-3421-RecursiveReferences
  • feature/PRXS-3170-TemplateFuncsFix
  • feature/PRXS-3143-3235-ReferenceOptions
  • feature/PRXS-1869-SuperUser
  • feature/PRXS-3106-NoCache
  • release/0.33
  • feature/2781-SpacesLoggingMiddleware
  • feature/PRXS-3143-LimitReferenceFields
  • feature/PRXS-3234-FeaturePruneIdents
  • feature/3109-SerializeFeature
  • feature/3109-RecoverySchema
  • feature/3109-feature
  • fix/PRXS-3369-ValidateFields
  • refactor/PRXS-3306-MovePkgGroup1
  • refactor/6-pkg-refactor-expr
  • fix/PRXS-3360-TemplateBuilderPatch
  • feature/3293-MongoV2
  • v0.34.0
  • v0.33.2
  • v0.33.1
  • v0.32.0
  • v0.31.1
  • v0.31.0
  • v0.30.0
  • v0.29.0
  • v0.28.0
  • v0.27.0-alpha.1+16
  • v0.27.0-alpha.1+15
  • v0.27.0-alpha.1+14
  • v0.27.0-alpha.1+13
  • v0.27.0-alpha.1+12
  • v0.27.0-alpha.1+11
  • v0.27.0-alpha.1+10
  • v0.27.0-alpha.1+9
  • v0.27.0-alpha.1+8
  • v0.27.0-alpha.1+7
  • v0.27.0-alpha.1+6
41 results

collection.go

Blame
  • search.go 2.22 KiB
    package search
    
    import (
    	"strings"
    
    	"git.perx.ru/perxis/perxis-go/pkg/errors"
    	"git.perx.ru/perxis/perxis-go/pkg/items"
    	bleve "github.com/blevesearch/bleve/v2"
    )
    
    func ItemTextSearch(query string, item *items.Item) (*items.Item, []string, error) {
    
    	index, err := bleve.NewMemOnly(bleve.NewIndexMapping())
    	if err != nil {
    		return nil, nil, err
    	}
    
    	if err = index.Index(item.ID, item); err != nil {
    		return nil, nil, err
    	}
    
    	searchRequest := bleve.NewSearchRequest(bleve.NewQueryStringQuery(query))
    	searchRequest.Highlight = bleve.NewHighlight()
    	searchResult, err := index.Search(searchRequest)
    	if err != nil {
    		return nil, nil, err
    	}
    
    	if searchResult.Total == 0 {
    		return nil, nil, errors.New("no results found")
    	}
    
    	hint := searchResult.Hits[0]
    
    	if hint.ID != item.ID {
    		return nil, nil, errors.New("search result not match item")
    	}
    
    	fields := make([]string, 0, len(hint.Fragments))
    	for key, value := range hint.Fragments {
    		key = strings.TrimPrefix(key, "data.")
    
    		if key == "id" {
    			item.Data[key] = value
    		}
    
    		if err = item.Set(key, value); err != nil {
    			return nil, nil, err
    		}
    		fields = append(fields, key)
    	}
    
    	return item, fields, nil
    }
    
    func ItemsTextSearch(query string, itms []*items.Item) ([]*items.Item, error) {
    
    	index, err := bleve.NewMemOnly(bleve.NewIndexMapping())
    	if err != nil {
    		return nil, err
    	}
    
    	im := make(map[string]*items.Item, len(itms))
    	for _, i := range itms {
    		im[i.ID] = i
    		if err = index.Index(i.ID, i); err != nil {
    			return nil, err
    		}
    	}
    
    	searchRequest := bleve.NewSearchRequest(bleve.NewQueryStringQuery(query))
    	searchRequest.Highlight = bleve.NewHighlight()
    	searchResult, err := index.Search(searchRequest)
    	if err != nil {
    		return nil, err
    	}
    
    	if searchResult.Total == 0 {
    		return nil, errors.New("no results found")
    	}
    
    	result := make([]*items.Item, 0, len(searchResult.Hits))
    	for _, hint := range searchResult.Hits {
    		item, ok := im[hint.ID]
    		if !ok {
    			return nil, errors.New("search result not match item")
    		}
    
    		for key, value := range hint.Fragments {
    			key = strings.TrimPrefix(key, "data.")
    
    			if key == "id" {
    				item.Data[key] = value
    			}
    
    			if err = item.Set(key, value); err != nil {
    				return nil, err
    			}
    		}
    		result = append(result, item)
    	}
    
    	return result, nil
    }