Is anyone interested in helping me test out a new query parser (i.e is
anyone interested in using this, thereby helping me test it) ?

The parser uses a intermediate parse tree representation, unlike Lucene's
Query Filter.


The syntax:

date[april 6, 1992] & field2,field3[parrot ~3s yore] | ((cat | horse) &
rabbit ~6 pete)

'&' is an 'and'


'|' is an 'or'


~2 is a 'within 2 words'


~5p is a 'within 5 paragraphs'


~6s is a 'within 6 sentences'


'!' is 'butnot'


' ' is an 'and' that binds tighter than anything else but can only connect
search tokens (i.e 'old man' not 'date[today] man'--that would be
date[today] & man...changeable of course:_)


field1, field2, field3[mark | butternut] performs a search on all 3 fields


date[20050601 to 20060504] uses constant scoring range query filter to date
search (can parse most date formats).


no arbitrary range search yet...

paragraph/sentence support requires a replacement (supplied) standard
analyzer and is optional.
there is also support for a "did you mean" feature that spits back the query
substituted with a did you mean guess based on the words in a supplied index
(the corpus or a dictionary maybe):


field1,field2[horke | tomcat] might return a suggested search of =
field1,field2[horse | tomcat]

I am about to add quoted searches as well as the ability to escape query
keywords.

more feature to come, there is a lot I want to change and add (and fix)...

if you are interested, drop me a line at [EMAIL PROTECTED]

- mark

Some sample proximity queries:

       example = "monkey fowl ~3 man ~5 horse head ~4 lamb";
       expected = "+(+spanNear([allFields:monkey, allFields:man], 3, false)
+spanNear([allFields:fowl, allFields:man], 3, false))
+(+spanNear([allFields:man, allFields:horse], 5, false)
+spanNear([allFields:man, allFields:head], 5, false)
+(+spanNear([allFields:horse, allFields:lamb], 4, false)
+spanNear([allFields:head, allFields:lamb], 4, false)))";
       assertEquals(expected, parse(example));
//
       example = "monkey ~3 man";
       expected = "spanNear([allFields:monkey, allFields:man], 3, false)";
       assertEquals(expected, parse(example));

       example = "monkey ord~3 man";
       expected = "spanNear([allFields:monkey, allFields:man], 3, true)";
       assertEquals(expected, parse(example));

       example = "monkey ~3 man ~2 her";
       expected = "+spanNear([allFields:monkey, allFields:man], 3, false)
+spanNear([allFields:man, allFields:her], 2, false)";
       assertEquals(expected, parse(example));

       example = "(fowl & helicopter) ~8 hillary";
       expected = "+spanNear([allFields:fowl, allFields:hillary], 8, false)
+spanNear([allFields:helicopter, allFields:hillary], 8, false)";
       assertEquals(expected, parse(example));

       example = "(fowl | helicopter) ~6 hillary";
       expected = "+spanNear([allFields:fowl, allFields:hillary], 8, false)
+spanNear([allFields:helicopter, allFields:hillary], 8, false)";
       assertEquals(expected, parse(example));
//
//        // butnot resolves before proximity search
//        example = "(cop | fowl) & (fowl & priest man) ! helicopter ~8
hillary";
//        expected = "+(allFields:cop allFields:fowl)
+(+spanNear([allFields:fowl, allFields:hillary], 8, false)
+spanNear([allFields:priest, allFields:hillary], 8, false)
+spanNear([allFields:man, allFields:hillary], 8, false)
-spanNear([allFields:helicopter, allFields:hillary], 8, false))";
//        assertEquals(expected, parse(example));
//
       example = "priest man ! helicopter ~8 hillary";
       expected = "+spanNear([allFields:priest, allFields:hillary], 8,
false) +spanNear([allFields:man, allFields:hillary], 8, false)
-spanNear([allFields:helicopter, allFields:hillary], 8, false)";
       assertEquals(expected, parse(example));

Reply via email to