0
0
Fork 0

fix query parser to recognize field prefix before fuzzy tilde

This commit is contained in:
Marty Schoch 2015-01-19 16:20:32 -05:00
parent 521d6101fd
commit 29b4f9623a
4 changed files with 507 additions and 442 deletions

View File

@ -162,7 +162,7 @@ func newLexerWithInit(in io.Reader, initFun func(*lexer)) *lexer {
}
go scan(bufio.NewReader(in), yylex.ch, []dfa{
// \"((\\\")|(\\\\)|(\\\/)|(\\b)|(\\f)|(\\n)|(\\r)|(\\t)|(\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])|[^\"])*\"
{[]bool{false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false}, []func(rune) int{ // Transitions
{[]bool{false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false}, []func(rune) int{ // Transitions
func(r rune) int {
switch r {
case 34:
@ -185,68 +185,6 @@ func newLexerWithInit(in io.Reader, initFun func(*lexer)) *lexer {
return -1
}
switch {
case 48 <= r && r <= 57:
return -1
case 65 <= r && r <= 70:
return -1
case 97 <= r && r <= 102:
return -1
}
return -1
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 92:
return 4
case 98:
return 3
case 102:
return 3
case 110:
return 3
case 114:
return 3
case 116:
return 3
case 117:
return 3
}
switch {
case 97 <= r && r <= 102:
return 3
case 65 <= r && r <= 70:
return 3
case 48 <= r && r <= 57:
return 3
}
return 3
},
func(r rune) int {
switch r {
case 34:
return -1
case 47:
return -1
case 92:
return -1
case 98:
return -1
case 102:
return -1
case 110:
return -1
case 114:
return -1
case 116:
return -1
case 117:
return -1
}
switch {
case 97 <= r && r <= 102:
return -1
case 65 <= r && r <= 70:
@ -259,350 +197,412 @@ func newLexerWithInit(in io.Reader, initFun func(*lexer)) *lexer {
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 47:
return 2
case 92:
return 4
case 98:
return 3
return 2
case 102:
return 3
return 2
case 110:
return 3
return 2
case 114:
return 3
return 2
case 116:
return 3
return 2
case 117:
return 3
return 2
}
switch {
case 97 <= r && r <= 102:
return 3
case 65 <= r && r <= 70:
return 3
case 48 <= r && r <= 57:
return 3
return 2
case 65 <= r && r <= 70:
return 2
case 97 <= r && r <= 102:
return 2
}
return 3
return 2
},
func(r rune) int {
switch r {
case 34:
return 5
return 3
case 47:
return 10
return 2
case 92:
return 9
return 4
case 98:
return 6
return 2
case 102:
return 11
return 2
case 110:
return 2
case 114:
return 2
case 116:
return 2
case 117:
return 2
}
switch {
case 48 <= r && r <= 57:
return 2
case 65 <= r && r <= 70:
return 2
case 97 <= r && r <= 102:
return 2
}
return 2
},
func(r rune) int {
switch r {
case 34:
return -1
case 47:
return -1
case 92:
return -1
case 98:
return -1
case 102:
return -1
case 110:
return -1
case 114:
return -1
case 116:
return -1
case 117:
return -1
}
switch {
case 48 <= r && r <= 57:
return -1
case 65 <= r && r <= 70:
return -1
case 97 <= r && r <= 102:
return -1
}
return -1
},
func(r rune) int {
switch r {
case 34:
return 7
case 114:
case 47:
return 8
case 116:
case 92:
return 12
case 117:
case 98:
return 13
}
switch {
case 97 <= r && r <= 102:
return 3
case 65 <= r && r <= 70:
return 3
case 48 <= r && r <= 57:
return 3
}
return 3
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 92:
return 4
case 98:
return 3
case 102:
return 3
case 110:
return 3
case 114:
return 3
case 116:
return 3
case 117:
return 3
}
switch {
case 97 <= r && r <= 102:
return 3
case 65 <= r && r <= 70:
return 3
case 48 <= r && r <= 57:
return 3
}
return 3
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 92:
return 4
case 98:
return 3
case 102:
return 3
case 110:
return 3
case 114:
return 3
case 116:
return 3
case 117:
return 3
}
switch {
case 48 <= r && r <= 57:
return 3
case 65 <= r && r <= 70:
return 3
case 97 <= r && r <= 102:
return 3
}
return 3
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 92:
return 4
case 98:
return 3
case 102:
return 3
case 110:
return 3
case 114:
return 3
case 116:
return 3
case 117:
return 3
}
switch {
case 48 <= r && r <= 57:
return 3
case 65 <= r && r <= 70:
return 3
case 97 <= r && r <= 102:
return 3
}
return 3
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 92:
return 4
case 98:
return 3
case 102:
return 3
case 110:
return 3
case 114:
return 3
case 116:
return 3
case 117:
return 3
}
switch {
case 48 <= r && r <= 57:
return 3
case 65 <= r && r <= 70:
return 3
case 97 <= r && r <= 102:
return 3
}
return 3
},
func(r rune) int {
switch r {
case 34:
return 5
case 47:
return 10
case 92:
return 9
case 98:
case 110:
return 10
case 114:
return 5
case 116:
return 6
case 102:
case 117:
return 11
}
switch {
case 48 <= r && r <= 57:
return 2
case 65 <= r && r <= 70:
return 2
case 97 <= r && r <= 102:
return 2
}
return 2
},
func(r rune) int {
switch r {
case 34:
return 3
case 47:
return 2
case 92:
return 4
case 98:
return 2
case 102:
return 2
case 110:
return 2
case 114:
return 2
case 116:
return 2
case 117:
return 2
}
switch {
case 97 <= r && r <= 102:
return 2
case 65 <= r && r <= 70:
return 2
case 48 <= r && r <= 57:
return 2
}
return 2
},
func(r rune) int {
switch r {
case 34:
return 3
case 47:
return 2
case 92:
return 4
case 98:
return 2
case 102:
return 2
case 110:
return 2
case 114:
return 2
case 116:
return 2
case 117:
return 2
}
switch {
case 97 <= r && r <= 102:
return 2
case 65 <= r && r <= 70:
return 2
case 48 <= r && r <= 57:
return 2
}
return 2
},
func(r rune) int {
switch r {
case 34:
return 3
case 47:
return 2
case 92:
return 4
case 98:
return 2
case 102:
return 2
case 110:
return 2
case 114:
return 2
case 116:
return 2
case 117:
return 2
}
switch {
case 48 <= r && r <= 57:
return 2
case 97 <= r && r <= 102:
return 2
case 65 <= r && r <= 70:
return 2
}
return 2
},
func(r rune) int {
switch r {
case 34:
return 3
case 47:
return 2
case 92:
return 4
case 98:
return 2
case 102:
return 2
case 110:
return 2
case 114:
return 2
case 116:
return 2
case 117:
return 2
}
switch {
case 97 <= r && r <= 102:
return 2
case 65 <= r && r <= 70:
return 2
case 48 <= r && r <= 57:
return 2
}
return 2
},
func(r rune) int {
switch r {
case 34:
return 3
case 47:
return 2
case 92:
return 4
case 98:
return 2
case 102:
return 2
case 110:
return 2
case 114:
return 2
case 116:
return 2
case 117:
return 2
}
switch {
case 65 <= r && r <= 70:
return 2
case 97 <= r && r <= 102:
return 2
case 48 <= r && r <= 57:
return 2
}
return 2
},
func(r rune) int {
switch r {
case 34:
return 3
case 47:
return 2
case 92:
return 4
case 98:
return 2
case 102:
return 2
case 110:
return 2
case 114:
return 2
case 116:
return 2
case 117:
return 2
}
switch {
case 97 <= r && r <= 102:
return 2
case 65 <= r && r <= 70:
return 2
case 48 <= r && r <= 57:
return 2
}
return 2
},
func(r rune) int {
switch r {
case 34:
return 3
case 47:
return 2
case 92:
return 4
case 98:
return 14
case 102:
return 14
case 110:
return 2
case 114:
return 2
case 116:
return 2
case 117:
return 2
}
switch {
case 97 <= r && r <= 102:
return 14
case 48 <= r && r <= 57:
return 14
case 65 <= r && r <= 70:
return 14
}
return 2
},
func(r rune) int {
switch r {
case 34:
return 7
case 114:
case 47:
return 8
case 116:
case 92:
return 12
case 117:
case 98:
return 13
case 102:
return 9
case 110:
return 10
case 114:
return 5
case 116:
return 6
case 117:
return 11
}
switch {
case 48 <= r && r <= 57:
return 3
case 65 <= r && r <= 70:
return 3
case 97 <= r && r <= 102:
return 3
return 2
case 65 <= r && r <= 70:
return 2
case 48 <= r && r <= 57:
return 2
}
return 3
return 2
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 47:
return 2
case 92:
return 4
case 98:
return 3
return 2
case 102:
return 3
return 2
case 110:
return 3
return 2
case 114:
return 3
return 2
case 116:
return 3
return 2
case 117:
return 3
return 2
}
switch {
case 48 <= r && r <= 57:
return 3
case 65 <= r && r <= 70:
return 3
return 2
case 97 <= r && r <= 102:
return 3
return 2
case 65 <= r && r <= 70:
return 2
}
return 3
return 2
},
func(r rune) int {
switch r {
case 34:
return 2
return 3
case 47:
return 3
case 92:
return 4
case 98:
return 3
case 102:
return 3
case 110:
return 3
case 114:
return 3
case 116:
return 3
case 117:
return 3
}
switch {
case 65 <= r && r <= 70:
return 3
case 97 <= r && r <= 102:
return 3
case 48 <= r && r <= 57:
return 3
}
return 3
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 92:
return 4
case 98:
return 3
case 102:
return 3
case 110:
return 3
case 114:
return 3
case 116:
return 3
case 117:
return 3
}
switch {
case 48 <= r && r <= 57:
return 3
case 65 <= r && r <= 70:
return 3
case 97 <= r && r <= 102:
return 3
}
return 3
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 92:
return 4
case 98:
return 14
case 102:
return 14
case 110:
return 3
case 114:
return 3
case 116:
return 3
case 117:
return 3
}
switch {
case 97 <= r && r <= 102:
return 14
case 65 <= r && r <= 70:
return 14
case 48 <= r && r <= 57:
return 14
}
return 3
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 92:
return 4
case 98:
@ -610,13 +610,13 @@ func newLexerWithInit(in io.Reader, initFun func(*lexer)) *lexer {
case 102:
return 15
case 110:
return 3
return 2
case 114:
return 3
return 2
case 116:
return 3
return 2
case 117:
return 3
return 2
}
switch {
case 97 <= r && r <= 102:
@ -626,14 +626,14 @@ func newLexerWithInit(in io.Reader, initFun func(*lexer)) *lexer {
case 48 <= r && r <= 57:
return 15
}
return 3
return 2
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 47:
return 2
case 92:
return 4
case 98:
@ -641,30 +641,30 @@ func newLexerWithInit(in io.Reader, initFun func(*lexer)) *lexer {
case 102:
return 16
case 110:
return 3
return 2
case 114:
return 3
return 2
case 116:
return 3
return 2
case 117:
return 3
return 2
}
switch {
case 48 <= r && r <= 57:
return 16
case 97 <= r && r <= 102:
return 16
case 65 <= r && r <= 70:
return 16
case 48 <= r && r <= 57:
return 16
}
return 3
return 2
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 47:
return 2
case 92:
return 4
case 98:
@ -672,54 +672,54 @@ func newLexerWithInit(in io.Reader, initFun func(*lexer)) *lexer {
case 102:
return 17
case 110:
return 3
return 2
case 114:
return 3
return 2
case 116:
return 3
return 2
case 117:
return 3
return 2
}
switch {
case 48 <= r && r <= 57:
return 17
case 65 <= r && r <= 70:
return 17
case 97 <= r && r <= 102:
return 17
case 65 <= r && r <= 70:
return 17
}
return 3
return 2
},
func(r rune) int {
switch r {
case 34:
return 2
case 47:
return 3
case 47:
return 2
case 92:
return 4
case 98:
return 3
return 2
case 102:
return 3
return 2
case 110:
return 3
return 2
case 114:
return 3
return 2
case 116:
return 3
return 2
case 117:
return 3
return 2
}
switch {
case 97 <= r && r <= 102:
return 3
case 65 <= r && r <= 70:
return 3
case 48 <= r && r <= 57:
return 3
return 2
case 97 <= r && r <= 102:
return 2
case 65 <= r && r <= 70:
return 2
}
return 3
return 2
},
}, []int{ /* Start-of-input transitions */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, []int{ /* End-of-input transitions */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, nil},

View File

@ -90,21 +90,42 @@ tSTRING {
|
tSTRING tTILDE {
str := $1
logDebugGrammar("STRING - %s", str)
logDebugGrammar("FUZZY STRING - %s", str)
q := NewMatchQuery(str)
q.SetFuzziness(1)
$$ = q
}
|
tSTRING tCOLON tSTRING tTILDE {
field := $1
str := $3
logDebugGrammar("FIELD - %s FUZZY STRING - %s", field, str)
q := NewMatchQuery(str)
q.SetFuzziness(1)
q.SetField(field)
$$ = q
}
|
tSTRING tTILDENUMBER {
str := $1
fuzziness, _ := strconv.ParseFloat($2, 64)
logDebugGrammar("STRING - %s", str)
logDebugGrammar("FUZZY STRING - %s", str)
q := NewMatchQuery(str)
q.SetFuzziness(int(fuzziness))
$$ = q
}
|
tSTRING tCOLON tSTRING tTILDENUMBER {
field := $1
str := $3
fuzziness, _ := strconv.ParseFloat($4, 64)
logDebugGrammar("FIELD - %s FUZZY-%f STRING - %s", field, fuzziness, str)
q := NewMatchQuery(str)
q.SetFuzziness(int(fuzziness))
q.SetField(field)
$$ = q
}
|
tNUMBER {
str := $1
logDebugGrammar("STRING - %s", str)

View File

@ -67,56 +67,57 @@ var yyExca = []int{
-2, 5,
}
const yyNprod = 24
const yyNprod = 26
const yyPrivate = 57344
var yyTokenNames []string
var yyStates []string
const yyLast = 30
const yyLast = 32
var yyAct = []int{
18, 27, 20, 22, 28, 30, 10, 12, 16, 17,
21, 23, 24, 25, 11, 29, 26, 19, 15, 6,
7, 2, 3, 1, 14, 8, 5, 4, 13, 9,
17, 25, 26, 20, 22, 32, 31, 29, 16, 18,
30, 21, 23, 24, 27, 10, 12, 28, 19, 15,
6, 7, 2, 11, 3, 1, 8, 14, 5, 4,
13, 9,
}
var yyPact = []int{
13, -1000, -1000, 13, 2, -1000, -1000, -1000, -1000, 9,
-8, -1000, -1000, -1000, -1000, 5, -1000, -1000, -2, -1000,
-1000, -1000, -1000, 1, -11, -1000, 3, -1000, -7, -1000,
-1000,
14, -1000, -1000, 14, 11, -1000, -1000, -1000, -1000, 10,
-8, -1000, -1000, -1000, -1000, 6, -1000, -1, -1000, -1000,
-15, -1000, -1000, 2, -5, -1000, -1000, -1000, -6, -1000,
-7, -1000, -1000,
}
var yyPgo = []int{
0, 29, 28, 27, 26, 24, 23, 21, 22,
0, 31, 30, 29, 28, 27, 25, 22, 24,
}
var yyR1 = []int{
0, 6, 7, 7, 8, 3, 3, 4, 4, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 5, 2, 2,
1, 1, 1, 5, 2, 2,
}
var yyR2 = []int{
0, 1, 2, 1, 3, 0, 1, 1, 1, 1,
2, 2, 1, 1, 3, 3, 3, 4, 5, 4,
5, 2, 0, 1,
2, 4, 2, 4, 1, 1, 3, 3, 3, 4,
5, 4, 5, 2, 0, 1,
}
var yyChk = []int{
-1000, -6, -7, -8, -3, -4, 6, 7, -7, -1,
4, 12, 5, -2, -5, 9, 16, 17, 8, 12,
4, 12, 5, 13, 14, 12, 15, 12, 15, 12,
12,
4, 12, 5, -2, -5, 9, 16, 8, 17, 12,
4, 12, 5, 13, 14, 16, 17, 12, 15, 12,
15, 12, 12,
}
var yyDef = []int{
5, -2, 1, -2, 0, 6, 7, 8, 2, 22,
9, 12, 13, 4, 23, 0, 10, 11, 0, 21,
14, 15, 16, 0, 0, 17, 0, 19, 0, 18,
20,
5, -2, 1, -2, 0, 6, 7, 8, 2, 24,
9, 14, 15, 4, 25, 0, 10, 0, 12, 23,
16, 17, 18, 0, 0, 11, 13, 19, 0, 21,
0, 20, 22,
}
var yyTok1 = []int{
@ -419,57 +420,80 @@ yydefault:
//line query_string.y:91
{
str := yyS[yypt-1].s
logDebugGrammar("STRING - %s", str)
logDebugGrammar("FUZZY STRING - %s", str)
q := NewMatchQuery(str)
q.SetFuzziness(1)
yyVAL.q = q
}
case 11:
//line query_string.y:99
{
field := yyS[yypt-3].s
str := yyS[yypt-1].s
logDebugGrammar("FIELD - %s FUZZY STRING - %s", field, str)
q := NewMatchQuery(str)
q.SetFuzziness(1)
q.SetField(field)
yyVAL.q = q
}
case 12:
//line query_string.y:109
{
str := yyS[yypt-1].s
fuzziness, _ := strconv.ParseFloat(yyS[yypt-0].s, 64)
logDebugGrammar("STRING - %s", str)
logDebugGrammar("FUZZY STRING - %s", str)
q := NewMatchQuery(str)
q.SetFuzziness(int(fuzziness))
yyVAL.q = q
}
case 12:
//line query_string.y:108
case 13:
//line query_string.y:118
{
field := yyS[yypt-3].s
str := yyS[yypt-1].s
fuzziness, _ := strconv.ParseFloat(yyS[yypt-0].s, 64)
logDebugGrammar("FIELD - %s FUZZY-%f STRING - %s", field, fuzziness, str)
q := NewMatchQuery(str)
q.SetFuzziness(int(fuzziness))
q.SetField(field)
yyVAL.q = q
}
case 14:
//line query_string.y:129
{
str := yyS[yypt-0].s
logDebugGrammar("STRING - %s", str)
q := NewMatchQuery(str)
yyVAL.q = q
}
case 13:
//line query_string.y:115
case 15:
//line query_string.y:136
{
phrase := yyS[yypt-0].s
logDebugGrammar("PHRASE - %s", phrase)
q := NewMatchPhraseQuery(phrase)
yyVAL.q = q
}
case 14:
//line query_string.y:122
{
field := yyS[yypt-2].s
str := yyS[yypt-0].s
logDebugGrammar("FIELD - %s STRING - %s", field, str)
q := NewMatchQuery(str).SetField(field)
yyVAL.q = q
}
case 15:
//line query_string.y:130
{
field := yyS[yypt-2].s
str := yyS[yypt-0].s
logDebugGrammar("FIELD - %s STRING - %s", field, str)
q := NewMatchQuery(str).SetField(field)
yyVAL.q = q
}
case 16:
//line query_string.y:138
//line query_string.y:143
{
field := yyS[yypt-2].s
str := yyS[yypt-0].s
logDebugGrammar("FIELD - %s STRING - %s", field, str)
q := NewMatchQuery(str).SetField(field)
yyVAL.q = q
}
case 17:
//line query_string.y:151
{
field := yyS[yypt-2].s
str := yyS[yypt-0].s
logDebugGrammar("FIELD - %s STRING - %s", field, str)
q := NewMatchQuery(str).SetField(field)
yyVAL.q = q
}
case 18:
//line query_string.y:159
{
field := yyS[yypt-2].s
phrase := yyS[yypt-0].s
@ -477,8 +501,8 @@ yydefault:
q := NewMatchPhraseQuery(phrase).SetField(field)
yyVAL.q = q
}
case 17:
//line query_string.y:146
case 19:
//line query_string.y:167
{
field := yyS[yypt-3].s
min, _ := strconv.ParseFloat(yyS[yypt-0].s, 64)
@ -487,8 +511,8 @@ yydefault:
q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil).SetField(field)
yyVAL.q = q
}
case 18:
//line query_string.y:155
case 20:
//line query_string.y:176
{
field := yyS[yypt-4].s
min, _ := strconv.ParseFloat(yyS[yypt-0].s, 64)
@ -497,8 +521,8 @@ yydefault:
q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil).SetField(field)
yyVAL.q = q
}
case 19:
//line query_string.y:164
case 21:
//line query_string.y:185
{
field := yyS[yypt-3].s
max, _ := strconv.ParseFloat(yyS[yypt-0].s, 64)
@ -507,8 +531,8 @@ yydefault:
q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive).SetField(field)
yyVAL.q = q
}
case 20:
//line query_string.y:173
case 22:
//line query_string.y:194
{
field := yyS[yypt-4].s
max, _ := strconv.ParseFloat(yyS[yypt-0].s, 64)
@ -517,20 +541,20 @@ yydefault:
q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive).SetField(field)
yyVAL.q = q
}
case 21:
//line query_string.y:183
case 23:
//line query_string.y:204
{
boost, _ := strconv.ParseFloat(yyS[yypt-0].s, 64)
yyVAL.f = boost
logDebugGrammar("BOOST %f", boost)
}
case 22:
//line query_string.y:190
case 24:
//line query_string.y:211
{
yyVAL.f = 1.0
}
case 23:
//line query_string.y:194
case 25:
//line query_string.y:215
{
}

View File

@ -196,6 +196,26 @@ func TestQuerySyntaxParserValid(t *testing.T) {
},
nil),
},
{
input: "field:watex~",
mapping: NewIndexMapping(),
result: NewBooleanQuery(
nil,
[]Query{
NewMatchQuery("watex").SetFuzziness(1).SetField("field"),
},
nil),
},
{
input: "field:watex~2",
mapping: NewIndexMapping(),
result: NewBooleanQuery(
nil,
[]Query{
NewMatchQuery("watex").SetFuzziness(2).SetField("field"),
},
nil),
},
}
for _, test := range tests {