![Marty Schoch](/assets/img/avatar_default.png)
many bugs fixed in existing search phrase query updated to support gaps in term sequence new query types all,none,match,phrase match and new query syntax search, like google search: +/-(optional field qualifier:)<term or quoted phrase>
81 lines
1.6 KiB
Go
81 lines
1.6 KiB
Go
package search
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/couchbaselabs/bleve/document"
|
|
)
|
|
|
|
var crashHard = false
|
|
var parserMutex sync.Mutex
|
|
var parsingDefaultField string
|
|
var parsingMust bool
|
|
var parsingMustNot bool
|
|
var debugParser bool
|
|
var debugLexer bool
|
|
|
|
var parsingMustList *TermConjunctionQuery
|
|
var parsingMustNotList *TermDisjunctionQuery
|
|
var parsingShouldList *TermDisjunctionQuery
|
|
var parsingMapping document.Mapping
|
|
|
|
func ParseQuerySyntax(query string, mapping document.Mapping) (rq Query, err error) {
|
|
parserMutex.Lock()
|
|
defer parserMutex.Unlock()
|
|
|
|
parsingMapping = mapping
|
|
|
|
parsingMustList = &TermConjunctionQuery{
|
|
Terms: make([]Query, 0),
|
|
BoostVal: 1.0,
|
|
Explain: true,
|
|
}
|
|
|
|
parsingMustNotList = &TermDisjunctionQuery{
|
|
Terms: make([]Query, 0),
|
|
BoostVal: 1.0,
|
|
Explain: true,
|
|
}
|
|
|
|
parsingShouldList = &TermDisjunctionQuery{
|
|
Terms: make([]Query, 0),
|
|
BoostVal: 1.0,
|
|
Explain: true,
|
|
Min: 1,
|
|
}
|
|
|
|
defer func() {
|
|
r := recover()
|
|
if r != nil && r == "syntax error" {
|
|
// if we're panicing over a syntax error, chill
|
|
err = fmt.Errorf("Parse Error - %v", r)
|
|
} else if r != nil {
|
|
// otherise continue to panic
|
|
if crashHard {
|
|
panic(r)
|
|
} else {
|
|
err = fmt.Errorf("Other Error - %v", r)
|
|
}
|
|
}
|
|
}()
|
|
|
|
yyParse(NewLexer(strings.NewReader(query)))
|
|
parsingQuery := &TermBooleanQuery{
|
|
BoostVal: 1.0,
|
|
Explain: true,
|
|
}
|
|
if len(parsingMustList.Terms) > 0 {
|
|
parsingQuery.Must = parsingMustList
|
|
}
|
|
if len(parsingMustNotList.Terms) > 0 {
|
|
parsingQuery.MustNot = parsingMustNotList
|
|
}
|
|
if len(parsingShouldList.Terms) > 0 {
|
|
parsingQuery.Should = parsingShouldList
|
|
}
|
|
rq = parsingQuery
|
|
return rq, err
|
|
}
|