0
0
bleve/search/query_syntax.y
Marty Schoch f225d484b3 overhauled search
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>
2014-07-11 14:49:59 -04:00

170 lines
3.1 KiB
Plaintext

%{
package search
import "log"
func logDebugGrammar(format string, v ...interface{}) {
if debugParser {
log.Printf(format, v...)
}
}
%}
%union {
s string
n int
f float64}
%token STRING PHRASE PLUS MINUS COLON BOOST LPAREN RPAREN INT STRING
%%
input:
searchParts {
logDebugGrammar("INPUT")
};
searchParts:
searchPart searchParts {
logDebugGrammar("SEARCH PARTS")
}
|
searchPart {
logDebugGrammar("SEARCH PART")
};
searchPart:
searchPrefix searchBase searchSuffix {
};
searchPrefix:
/* empty */ {
}
|
searchMustMustNot {
}
;
searchMustMustNot:
PLUS {
logDebugGrammar("PLUS")
parsingMust = true
}
|
MINUS {
logDebugGrammar("MINUS")
parsingMustNot = true
};
searchBase:
STRING {
str := $1.s
logDebugGrammar("STRING - %s", str)
q := &MatchQuery{
Match: str,
Field: parsingDefaultField,
BoostVal: 1.0,
Explain: true,
}
if parsingMapping[parsingDefaultField] != nil {
q.Analyzer = parsingMapping[parsingDefaultField].Analyzer
}
if parsingMust {
parsingMustList.Terms = append(parsingMustList.Terms, q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.Terms = append(parsingMustNotList.Terms, q)
parsingMustNot = false
} else {
parsingShouldList.Terms = append(parsingShouldList.Terms, q)
}
}
|
PHRASE {
phrase := $1.s
logDebugGrammar("PHRASE - %s", phrase)
q := &MatchPhraseQuery{
MatchPhrase: phrase,
Field: parsingDefaultField,
BoostVal: 1.0,
Explain: true,
}
if parsingMapping[parsingDefaultField] != nil {
q.Analyzer = parsingMapping[parsingDefaultField].Analyzer
}
if parsingMust {
parsingMustList.Terms = append(parsingMustList.Terms, q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.Terms = append(parsingMustNotList.Terms, q)
parsingMustNot = false
} else {
parsingShouldList.Terms = append(parsingShouldList.Terms, q)
}
}
|
STRING COLON STRING {
field := $1.s
str := $3.s
logDebugGrammar("FIELD - %s STRING - %s", field, str)
q := &MatchQuery{
Match: str,
Field: field,
BoostVal: 1.0,
Explain: true,
}
if parsingMapping[field] != nil {
q.Analyzer = parsingMapping[field].Analyzer
}
if parsingMust {
parsingMustList.Terms = append(parsingMustList.Terms, q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.Terms = append(parsingMustNotList.Terms, q)
parsingMustNot = false
} else {
parsingShouldList.Terms = append(parsingShouldList.Terms, q)
}
}
|
STRING COLON PHRASE {
field := $1.s
phrase := $3.s
logDebugGrammar("FIELD - %s PHRASE - %s", field, phrase)
q := &MatchPhraseQuery{
MatchPhrase: phrase,
Field: field,
BoostVal: 1.0,
Explain: true,
}
if parsingMapping[field] != nil {
q.Analyzer = parsingMapping[field].Analyzer
}
if parsingMust {
parsingMustList.Terms = append(parsingMustList.Terms, q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.Terms = append(parsingMustNotList.Terms, q)
parsingMustNot = false
} else {
parsingShouldList.Terms = append(parsingShouldList.Terms, q)
}
};
searchBoost:
BOOST INT {
boost := $1.n
logDebugGrammar("BOOST %d", boost)
}
searchSuffix:
/* empty */ {
}
|
searchBoost {
};