0
0
Fork 0
bleve/search.go

118 lines
3.1 KiB
Go
Raw Normal View History

// Copyright (c) 2014 Couchbase, Inc.
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software distributed under the
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
// either express or implied. See the License for the specific language governing permissions
// and limitations under the License.
package bleve
import (
"encoding/json"
"fmt"
"time"
"github.com/couchbaselabs/bleve/search"
)
type HighlightRequest struct {
Style *string `json:"style"`
Fields []string `json:"fields"`
}
func NewHighlight() *HighlightRequest {
return &HighlightRequest{}
}
func NewHighlightWithStyle(style string) *HighlightRequest {
return &HighlightRequest{
Style: &style,
}
}
type SearchRequest struct {
Query Query `json:"query"`
Size int `json:"size"`
From int `json:"from"`
Highlight *HighlightRequest `json:"highlight"`
Fields []string `json:"fields"`
Explain bool `json:"explain"`
}
func (r *SearchRequest) UnmarshalJSON(input []byte) error {
var temp struct {
Q json.RawMessage `json:"query"`
Size int `json:"size"`
From int `json:"from"`
Highlight *HighlightRequest `json:"highlight"`
Fields []string `json:"fields"`
Explain bool `json:"explain"`
}
err := json.Unmarshal(input, &temp)
if err != nil {
return err
}
r.Size = temp.Size
r.From = temp.From
r.Explain = temp.Explain
r.Highlight = temp.Highlight
r.Fields = temp.Fields
r.Query, err = ParseQuery(temp.Q)
if err != nil {
return err
}
if r.Size <= 0 {
r.Size = 10
}
if r.From <= 0 {
r.From = 0
}
return nil
}
2014-07-31 16:58:20 +02:00
func NewSearchRequest(q Query) *SearchRequest {
return NewSearchRequestOptions(q, 10, 0, false)
}
func NewSearchRequestOptions(q Query, size, from int, explain bool) *SearchRequest {
return &SearchRequest{
Query: q,
Size: size,
From: from,
Explain: explain,
}
}
type SearchResult struct {
Request *SearchRequest `json:"request"`
Hits search.DocumentMatchCollection `json:"hits"`
Total uint64 `json:"total_hits"`
MaxScore float64 `json:"max_score"`
Took time.Duration `json:"took"`
}
func (sr *SearchResult) String() string {
rv := ""
if len(sr.Hits) > 0 {
rv = fmt.Sprintf("%d matches, showing %d through %d, took %s\n", sr.Total, sr.Request.From+1, sr.Request.From+len(sr.Hits), sr.Took)
for i, hit := range sr.Hits {
rv += fmt.Sprintf("%5d. %s (%f)\n", i+sr.Request.From+1, hit.ID, hit.Score)
for fragmentField, fragments := range hit.Fragments {
rv += fmt.Sprintf("\t%s\n", fragmentField)
for _, fragment := range fragments {
rv += fmt.Sprintf("\t\t%s\n", fragment)
}
}
}
} else {
rv = "No matches"
}
return rv
}