summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/blevesearch/bleve/search.go
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2019-02-18 08:50:26 +0800
committertechknowlogick <matti@mdranta.net>2019-02-17 19:50:26 -0500
commita380cfd8e03148a05859a7496d235fa14bde4796 (patch)
tree9ef2f4b66804e73e242d0d07fd30769898a0ca23 /vendor/github.com/blevesearch/bleve/search.go
parent11e316654e523bd668a20e1e6a95da3f5b9b22de (diff)
downloadgitea-a380cfd8e03148a05859a7496d235fa14bde4796.tar.gz
gitea-a380cfd8e03148a05859a7496d235fa14bde4796.zip
Update bleve dependency to latest master revision (#6100)
* update bleve to master b17287a86f6cac923a5d886e10618df994eeb54b6724eac2e3b8dde89cfbe3a2 * remove unused pkg from dep file * change bleve from master to recent revision
Diffstat (limited to 'vendor/github.com/blevesearch/bleve/search.go')
-rw-r--r--vendor/github.com/blevesearch/bleve/search.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/vendor/github.com/blevesearch/bleve/search.go b/vendor/github.com/blevesearch/bleve/search.go
index 46d849c1b1..ebd69971ef 100644
--- a/vendor/github.com/blevesearch/bleve/search.go
+++ b/vendor/github.com/blevesearch/bleve/search.go
@@ -17,15 +17,29 @@ package bleve
import (
"encoding/json"
"fmt"
+ "reflect"
"time"
"github.com/blevesearch/bleve/analysis"
"github.com/blevesearch/bleve/analysis/datetime/optional"
+ "github.com/blevesearch/bleve/document"
"github.com/blevesearch/bleve/registry"
"github.com/blevesearch/bleve/search"
+ "github.com/blevesearch/bleve/search/collector"
"github.com/blevesearch/bleve/search/query"
+ "github.com/blevesearch/bleve/size"
)
+var reflectStaticSizeSearchResult int
+var reflectStaticSizeSearchStatus int
+
+func init() {
+ var sr SearchResult
+ reflectStaticSizeSearchResult = int(reflect.TypeOf(sr).Size())
+ var ss SearchStatus
+ reflectStaticSizeSearchStatus = int(reflect.TypeOf(ss).Size())
+}
+
var cache = registry.NewCache()
const defaultDateTimeParser = optional.Name
@@ -247,6 +261,7 @@ func (h *HighlightRequest) AddField(field string) {
// Explain triggers inclusion of additional search
// result score explanations.
// Sort describes the desired order for the results to be returned.
+// Score controls the kind of scoring performed
//
// A special field named "*" can be used to return all fields.
type SearchRequest struct {
@@ -259,6 +274,7 @@ type SearchRequest struct {
Explain bool `json:"explain"`
Sort search.SortOrder `json:"sort"`
IncludeLocations bool `json:"includeLocations"`
+ Score string `json:"score,omitempty"`
}
func (r *SearchRequest) Validate() error {
@@ -308,6 +324,7 @@ func (r *SearchRequest) UnmarshalJSON(input []byte) error {
Explain bool `json:"explain"`
Sort []json.RawMessage `json:"sort"`
IncludeLocations bool `json:"includeLocations"`
+ Score string `json:"score"`
}
err := json.Unmarshal(input, &temp)
@@ -334,6 +351,7 @@ func (r *SearchRequest) UnmarshalJSON(input []byte) error {
r.Fields = temp.Fields
r.Facets = temp.Facets
r.IncludeLocations = temp.IncludeLocations
+ r.Score = temp.Score
r.Query, err = query.ParseQuery(temp.Q)
if err != nil {
return err
@@ -432,6 +450,24 @@ type SearchResult struct {
Facets search.FacetResults `json:"facets"`
}
+func (sr *SearchResult) Size() int {
+ sizeInBytes := reflectStaticSizeSearchResult + size.SizeOfPtr +
+ reflectStaticSizeSearchStatus
+
+ for _, entry := range sr.Hits {
+ if entry != nil {
+ sizeInBytes += entry.Size()
+ }
+ }
+
+ for k, v := range sr.Facets {
+ sizeInBytes += size.SizeOfString + len(k) +
+ v.Size()
+ }
+
+ return sizeInBytes
+}
+
func (sr *SearchResult) String() string {
rv := ""
if sr.Total > 0 {
@@ -488,3 +524,44 @@ func (sr *SearchResult) Merge(other *SearchResult) {
sr.Facets.Merge(other.Facets)
}
+
+// MemoryNeededForSearchResult is an exported helper function to determine the RAM
+// needed to accommodate the results for a given search request.
+func MemoryNeededForSearchResult(req *SearchRequest) uint64 {
+ if req == nil {
+ return 0
+ }
+
+ numDocMatches := req.Size + req.From
+ if req.Size+req.From > collector.PreAllocSizeSkipCap {
+ numDocMatches = collector.PreAllocSizeSkipCap
+ }
+
+ estimate := 0
+
+ // overhead from the SearchResult structure
+ var sr SearchResult
+ estimate += sr.Size()
+
+ var dm search.DocumentMatch
+ sizeOfDocumentMatch := dm.Size()
+
+ // overhead from results
+ estimate += numDocMatches * sizeOfDocumentMatch
+
+ // overhead from facet results
+ if req.Facets != nil {
+ var fr search.FacetResult
+ estimate += len(req.Facets) * fr.Size()
+ }
+
+ // highlighting, store
+ var d document.Document
+ if len(req.Fields) > 0 || req.Highlight != nil {
+ for i := 0; i < (req.Size + req.From); i++ {
+ estimate += (req.Size + req.From) * d.Size()
+ }
+ }
+
+ return uint64(estimate)
+}