2014-07-11 20:49:59 +02:00
|
|
|
%{
|
2014-07-30 18:30:38 +02:00
|
|
|
package bleve
|
2014-07-11 20:49:59 +02:00
|
|
|
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)
|
2014-07-30 18:30:38 +02:00
|
|
|
q := NewMatchQuery(str).SetField(parsingDefaultField)
|
2014-07-11 20:49:59 +02:00
|
|
|
if parsingMust {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingMustList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
parsingMust = false
|
|
|
|
} else if parsingMustNot {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingMustNotList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
parsingMustNot = false
|
|
|
|
} else {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingShouldList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
PHRASE {
|
|
|
|
phrase := $1.s
|
|
|
|
logDebugGrammar("PHRASE - %s", phrase)
|
2014-07-30 18:30:38 +02:00
|
|
|
q := NewMatchPhraseQuery(phrase).SetField(parsingDefaultField)
|
2014-07-11 20:49:59 +02:00
|
|
|
if parsingMust {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingMustList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
parsingMust = false
|
|
|
|
} else if parsingMustNot {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingMustNotList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
parsingMustNot = false
|
|
|
|
} else {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingShouldList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
STRING COLON STRING {
|
|
|
|
field := $1.s
|
|
|
|
str := $3.s
|
|
|
|
logDebugGrammar("FIELD - %s STRING - %s", field, str)
|
2014-07-30 18:30:38 +02:00
|
|
|
q := NewMatchQuery(str).SetField(field)
|
2014-07-11 20:49:59 +02:00
|
|
|
if parsingMust {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingMustList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
parsingMust = false
|
|
|
|
} else if parsingMustNot {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingMustNotList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
parsingMustNot = false
|
|
|
|
} else {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingShouldList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
STRING COLON PHRASE {
|
|
|
|
field := $1.s
|
|
|
|
phrase := $3.s
|
|
|
|
logDebugGrammar("FIELD - %s PHRASE - %s", field, phrase)
|
2014-07-30 18:30:38 +02:00
|
|
|
q := NewMatchPhraseQuery(phrase).SetField(field)
|
2014-07-11 20:49:59 +02:00
|
|
|
if parsingMust {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingMustList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
parsingMust = false
|
|
|
|
} else if parsingMustNot {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingMustNotList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
parsingMustNot = false
|
|
|
|
} else {
|
2014-07-30 18:30:38 +02:00
|
|
|
parsingShouldList.AddQuery(q)
|
2014-07-11 20:49:59 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
searchBoost:
|
|
|
|
BOOST INT {
|
|
|
|
boost := $1.n
|
|
|
|
logDebugGrammar("BOOST %d", boost)
|
|
|
|
}
|
|
|
|
|
|
|
|
searchSuffix:
|
|
|
|
/* empty */ {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
searchBoost {
|
|
|
|
|
|
|
|
};
|