170 lines
3.1 KiB
Plaintext
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 {
|
||
|
|
||
|
};
|