/* ***************** */
/* Token Definitions */
/* ***************** */<*> TOKEN : {<#_NUM_CHAR: ["0"-"9"] > //最好不要定义成全局的否则会左右很多的事情
| <#_ESCAPED_CHAR: "\\" ~[] > //经过转以后的任意字符如\\s,\\t //~[]表示包含所有的字符
| <#_TERM_START_CHAR: ( ~[ " ", "\t", "\n", "\r", "\u3000", "+", "-", "!", "(", ")", ":", "^","[", "]","<", ">","\"","#","%","'", "{", "}","~", "*", "?","\\" ,"=",","]| <_ESCAPED_CHAR> ) >
| <#_TERM_CHAR: ( <_TERM_START_CHAR> | <_ESCAPED_CHAR> | "-" | "+" ) >
| <#_WHITESPACE: ( " " | "\t" | "\n" | "\r" | "\u3000") >
| <#_QUOTED_CHAR: ( ~[ "\"", "\\" ] | <_ESCAPED_CHAR> ) >
} SKIP : {< <_WHITESPACE>>
} TOKEN : {
|
|
| //注意在全局定义的收不要定义([A-Z]|[a-z])*这样的的定义这样也会造成局限性
| )*)>
| )*) >
|
| " >
|
|
|
|
|
|
|
|
|
| : Boost
| )* "\"">
| (<_TERM_CHAR>)* >
| ( (<_NUM_CHAR>)+ ( "." (<_NUM_CHAR>)+ )? )? >
| (<_TERM_CHAR>)* "*" ) >
| | [ "*", "?" ]) (<_TERM_CHAR> | ( [ "*", "?" ] ))* >
| : RangeIn
| : RangeEx
} TOKEN : {
)+ ( "." (<_NUM_CHAR>)+ )? > : DEFAULT
} TOKEN : {
|< SHIT>)>
| : DEFAULT
|
|
} TOKEN : {
> //有些定义是可以重复使用的如
| : DEFAULT
|
|
}// * Query ::= ( Clause )*
// * Clause ::= ["+", "-"] [ ":"] ( | "(" Query ")" )int Conjunction() : {int ret = CONJ_NONE;
}
{[ { ret = CONJ_AND; }| { ret = CONJ_OR; }]{ return ret; }
}int Modifiers() : {int ret = MOD_NONE;
}
{[ { ret = MOD_REQ; }| { ret = MOD_NOT; }| { ret = MOD_NOT; }]{ return ret; }
}// This makes sure that there is no garbage after the query string
Query TopLevelQuery(String field) :
{Query q;
}
{q=Query(field) {return q;}
}Query Query(String field) :
{List clauses = new ArrayList();Query q, firstQuery=null;int conj, mods;
}
{mods=Modifiers() q=Clause(field){addClause(clauses, CONJ_NONE, mods, q);if (mods == MOD_NONE)firstQuery=q;}(conj=Conjunction() mods=Modifiers() q=Clause(field){ addClause(clauses, conj, mods, q); })*{if (clauses.size() == 1 && firstQuery != null)return firstQuery;else {return getBooleanQuery(clauses);}}
}Query Clause(String field) : {Query q;Token fieldToken=null;Token lparen=null;
}
{[LOOKAHEAD(2)(fieldToken= {field=discardEscapeChar(fieldToken.image);}| {field="*";})]((LOOKAHEAD(3)(LOOKAHEAD(3)q = distanceQueryStart(field)| q = Term(field))|(){lbrace+=1;appendlbrace+=1;}q=Query(field) (|{if(lbrace!=rbrace){throw new ParseException("brace does not matches");}else{return q;}}){appendlbrace=0;}( boost=)? )){if (boost != null) {float f = (float)1.0;try {f = Float.valueOf(boost.image).floatValue();q.setBoost(f);} catch (Exception ignored) { }}return q;}
}Query rangeTerm(String field):
{Token term,fuzzySlop=null, goop1, goop2;Query q;
}
{(( ( goop1=|goop1= )[ ] ( goop2=|goop2= ) )[ boost= ]{if (goop1.kind == RANGEIN_QUOTED) {goop1.image = goop1.image.substring(1, goop1.image.length()-1);}if (goop2.kind == RANGEIN_QUOTED) {goop2.image = goop2.image.substring(1, goop2.image.length()-1);}q = getRangeQuery(field, discardEscapeChar(goop1.image), discardEscapeChar(goop2.image), true);}| ( ( goop1=|goop1= )[ ] ( goop2=|goop2= ) )[ boost= ]{if (goop1.kind == RANGEEX_QUOTED) {goop1.image = goop1.image.substring(1, goop1.image.length()-1);}if (goop2.kind == RANGEEX_QUOTED) {goop2.image = goop2.image.substring(1, goop2.image.length()-1);}q = getRangeQuery(field, discardEscapeChar(goop1.image), discardEscapeChar(goop2.image), false);}){return q;}
}void distanceQuery(String field,String beforeStr):
{Token term, boost=null;Token slop=null;
}
{(( slop=< NEAR>|slop=< WORDFORWARD>|slop=< WORDNEAR>|slop=< SPACE>){disnwcout+=1;sb.append(" "+slop.image.trim()+" ");distanceQuery(field,beforeStr);return;}|term = < TERM>{diskycout+=1;sb.append(term.image.trim());distanceQuery(field,beforeStr);return;}|({sb.append(" ( ");lbrace+=1;}|< RPAREN>{rbrace+=1;sb.append(" ) ");}){distanceQuery(field,beforeStr);return;}|[ boost=]{if(diskycout!=0 && disnwcout!=0 && diskycout-disnwcout!=1){throw new ParseException("the keyword does not matches");}DistanceQueryFormat format = new DistanceQueryFormat();DistanceQueryFormat.parenMatches(lbrace,rbrace);distanceQuery = format.formatPhraseTerm(field+":"+beforeStr+" "+sb.toString().trim());//System.out.println(field+":"+beforeStr+" "+sb.toString().trim());lbrace=0;rbrace=0;diskycout=0;disnwcout=0;sb = new StringBuffer();} )}Query distanceQueryStart(String field):
{Token slop=null;Token term = null;Token lparen = new Token();lparen.image="";
}
{
(term =< TERM >( slop=< NEAR>|slop=< WORDFORWARD>|slop=< WORDNEAR>|slop=< SPACE>)|lparen=< LPAREN> term=< TERM>( slop=< NEAR>|slop=< WORDFORWARD>|slop=< WORDNEAR>|slop=< SPACE>){lbrace+=1;}
){diskycout+=1;disnwcout+=1;String lb="";for(int i=0;i| term= { wildcard=true; }| term= { prefix=true; }| term= { wildcard=true; }| term=)[ (fuzzySlop=| < SHIT>) { fuzzy=true; } ][ boost= [ fuzzySlop= { fuzzy=true; } ] ]{String termImage=discardEscapeChar(term.image);if (wildcard) {q = getWildcardQuery(field, termImage);} else if (prefix) {q = getPrefixQuery(field,discardEscapeChar(term.image.substring(0, term.image.length()-1)));} else if (fuzzy) {float fms = fuzzyMinSim;try {fms = Float.valueOf(fuzzySlop.image.substring(1)).floatValue();} catch (Exception ignored) { }if(fms < 0.0f || fms > 1.0f){throw new ParseException("Minimum similarity for a FuzzyQuery has to be between 0.0f and 1.0f !");}q = getFuzzyQuery(field, termImage,fms);}else {q = hasNewAPI ? getFieldQuery(field, termImage, false) : getFieldQuery(field, termImage);}}){return q;}
}Query quotedTerm(String field):
{Query q;Token term,fuzzySlop=null;
}
{(term=[ fuzzySlop= ][ boost= ]{int s = phraseSlop;if (fuzzySlop != null) {try {s = Float.valueOf(fuzzySlop.image.substring(1)).intValue();}catch (Exception ignored) { }}q = getFieldQuery(field, discardEscapeChar(term.image.substring(1, term.image.length()-1)), s);}){return q;}
}Query smpRange(String field):
{Token term1,term2,boost=null;Query q;Token mark;
}
{term1=< TERM >(mark=< GREATER>|mark=< LESS>)term2=< TERM >[ boost= ]{if(mark.image.trim().matches("[>]")){q = getRangeQuery(term1.image.trim(),term2.image.trim(),String.valueOf(Long.MAX_VALUE),true);}else{q = getRangeQuery(term1.image.trim(),String.valueOf(0),term2.image.trim(),true);}return q;}
}Query Term(String field) : {Token term,fuzzySlop=null, goop1, goop2;boolean prefix = false;boolean wildcard = false;boolean fuzzy = false;Query q;
}
{( (LOOKAHEAD(2)q = smpRange(field) |q = smpTerm(field))|q = rangeTerm(field)|q = quotedTerm(field)){if (boost != null) {float f = (float) 1.0;try {f = Float.valueOf(boost.image).floatValue();}catch (Exception ignored) {/* Should this be handled somehow? (defaults to "no boost", if* boost number is invalid)*/}// avoid boosting null queries, such as those caused by stop wordsif (q != null) {q.setBoost(f);}}boost = null;return q;}}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!