Resolve QueryParser exception.
This commit is contained in:
parent
fb4defedb7
commit
f0059e2c78
|
@ -46,11 +46,11 @@ import java.util.Stack;
|
|||
public class IKQueryExpressionParser {
|
||||
|
||||
|
||||
private List<Element> elements = new ArrayList<>();
|
||||
private final List<Element> elements = new ArrayList<>();
|
||||
|
||||
private Stack<Query> querys = new Stack<>();
|
||||
private final Stack<Query> querys = new Stack<>();
|
||||
|
||||
private Stack<Element> operates = new Stack<>();
|
||||
private final Stack<Element> operates = new Stack<>();
|
||||
|
||||
/**
|
||||
* 解析查询表达式,生成Lucene Query对象
|
||||
|
@ -87,263 +87,263 @@ public class IKQueryExpressionParser {
|
|||
if (expression == null) {
|
||||
return;
|
||||
}
|
||||
Element curretElement = null;
|
||||
Element currentElement = null;
|
||||
|
||||
char[] expChars = expression.toCharArray();
|
||||
for (char expChar : expChars) {
|
||||
switch (expChar) {
|
||||
case '&':
|
||||
if (curretElement == null) {
|
||||
curretElement = new Element();
|
||||
curretElement.type = '&';
|
||||
curretElement.append(expChar);
|
||||
} else if (curretElement.type == '&') {
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
} else if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement == null) {
|
||||
currentElement = new Element();
|
||||
currentElement.type = '&';
|
||||
currentElement.append(expChar);
|
||||
} else if (currentElement.type == '&') {
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
} else if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
curretElement = new Element();
|
||||
curretElement.type = '&';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = new Element();
|
||||
currentElement.type = '&';
|
||||
currentElement.append(expChar);
|
||||
}
|
||||
break;
|
||||
|
||||
case '|':
|
||||
if (curretElement == null) {
|
||||
curretElement = new Element();
|
||||
curretElement.type = '|';
|
||||
curretElement.append(expChar);
|
||||
} else if (curretElement.type == '|') {
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
} else if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement == null) {
|
||||
currentElement = new Element();
|
||||
currentElement.type = '|';
|
||||
currentElement.append(expChar);
|
||||
} else if (currentElement.type == '|') {
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
} else if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
curretElement = new Element();
|
||||
curretElement.type = '|';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = new Element();
|
||||
currentElement.type = '|';
|
||||
currentElement.append(expChar);
|
||||
}
|
||||
break;
|
||||
|
||||
case '-':
|
||||
if (curretElement != null) {
|
||||
if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement != null) {
|
||||
if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
continue;
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
this.elements.add(currentElement);
|
||||
}
|
||||
}
|
||||
curretElement = new Element();
|
||||
curretElement.type = '-';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
currentElement = new Element();
|
||||
currentElement.type = '-';
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
break;
|
||||
|
||||
case '(':
|
||||
if (curretElement != null) {
|
||||
if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement != null) {
|
||||
if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
continue;
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
this.elements.add(currentElement);
|
||||
}
|
||||
}
|
||||
curretElement = new Element();
|
||||
curretElement.type = '(';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
currentElement = new Element();
|
||||
currentElement.type = '(';
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
break;
|
||||
|
||||
case ')':
|
||||
if (curretElement != null) {
|
||||
if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement != null) {
|
||||
if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
continue;
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
this.elements.add(currentElement);
|
||||
}
|
||||
}
|
||||
curretElement = new Element();
|
||||
curretElement.type = ')';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
currentElement = new Element();
|
||||
currentElement.type = ')';
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
break;
|
||||
|
||||
case ':':
|
||||
if (curretElement != null) {
|
||||
if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement != null) {
|
||||
if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
continue;
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
this.elements.add(currentElement);
|
||||
}
|
||||
}
|
||||
curretElement = new Element();
|
||||
curretElement.type = ':';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
currentElement = new Element();
|
||||
currentElement.type = ':';
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
break;
|
||||
|
||||
case '=':
|
||||
if (curretElement != null) {
|
||||
if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement != null) {
|
||||
if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
continue;
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
this.elements.add(currentElement);
|
||||
}
|
||||
}
|
||||
curretElement = new Element();
|
||||
curretElement.type = '=';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
currentElement = new Element();
|
||||
currentElement.type = '=';
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
break;
|
||||
|
||||
case ' ':
|
||||
if (curretElement != null) {
|
||||
if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement != null) {
|
||||
if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
if (curretElement == null) {
|
||||
curretElement = new Element();
|
||||
curretElement.type = '\'';
|
||||
if (currentElement == null) {
|
||||
currentElement = new Element();
|
||||
currentElement.type = '\'';
|
||||
|
||||
} else if (curretElement.type == '\'') {
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
} else if (currentElement.type == '\'') {
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
curretElement = new Element();
|
||||
curretElement.type = '\'';
|
||||
this.elements.add(currentElement);
|
||||
currentElement = new Element();
|
||||
currentElement.type = '\'';
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case '[':
|
||||
if (curretElement != null) {
|
||||
if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement != null) {
|
||||
if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
continue;
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
this.elements.add(currentElement);
|
||||
}
|
||||
}
|
||||
curretElement = new Element();
|
||||
curretElement.type = '[';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
currentElement = new Element();
|
||||
currentElement.type = '[';
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
break;
|
||||
|
||||
case ']':
|
||||
if (curretElement != null) {
|
||||
if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement != null) {
|
||||
if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
continue;
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
this.elements.add(currentElement);
|
||||
}
|
||||
}
|
||||
curretElement = new Element();
|
||||
curretElement.type = ']';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
currentElement = new Element();
|
||||
currentElement.type = ']';
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
|
||||
break;
|
||||
|
||||
case '{':
|
||||
if (curretElement != null) {
|
||||
if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement != null) {
|
||||
if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
continue;
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
this.elements.add(currentElement);
|
||||
}
|
||||
}
|
||||
curretElement = new Element();
|
||||
curretElement.type = '{';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
currentElement = new Element();
|
||||
currentElement.type = '{';
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
break;
|
||||
|
||||
case '}':
|
||||
if (curretElement != null) {
|
||||
if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement != null) {
|
||||
if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
continue;
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
this.elements.add(currentElement);
|
||||
}
|
||||
}
|
||||
curretElement = new Element();
|
||||
curretElement.type = '}';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
currentElement = new Element();
|
||||
currentElement.type = '}';
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
|
||||
break;
|
||||
case ',':
|
||||
if (curretElement != null) {
|
||||
if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
if (currentElement != null) {
|
||||
if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
continue;
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
this.elements.add(currentElement);
|
||||
}
|
||||
}
|
||||
curretElement = new Element();
|
||||
curretElement.type = ',';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(curretElement);
|
||||
curretElement = null;
|
||||
currentElement = new Element();
|
||||
currentElement.type = ',';
|
||||
currentElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = null;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
if (curretElement == null) {
|
||||
curretElement = new Element();
|
||||
curretElement.type = 'F';
|
||||
curretElement.append(expChar);
|
||||
if (currentElement == null) {
|
||||
currentElement = new Element();
|
||||
currentElement.type = 'F';
|
||||
currentElement.append(expChar);
|
||||
|
||||
} else if (curretElement.type == 'F') {
|
||||
curretElement.append(expChar);
|
||||
} else if (currentElement.type == 'F') {
|
||||
currentElement.append(expChar);
|
||||
|
||||
} else if (curretElement.type == '\'') {
|
||||
curretElement.append(expChar);
|
||||
} else if (currentElement.type == '\'') {
|
||||
currentElement.append(expChar);
|
||||
|
||||
} else {
|
||||
this.elements.add(curretElement);
|
||||
curretElement = new Element();
|
||||
curretElement.type = 'F';
|
||||
curretElement.append(expChar);
|
||||
this.elements.add(currentElement);
|
||||
currentElement = new Element();
|
||||
currentElement.type = 'F';
|
||||
currentElement.append(expChar);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (curretElement != null) {
|
||||
this.elements.add(curretElement);
|
||||
if (currentElement != null) {
|
||||
this.elements.add(currentElement);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -673,7 +673,7 @@ public class IKQueryExpressionParser {
|
|||
* @author linliangyi
|
||||
* May 20, 2010
|
||||
*/
|
||||
private class Element {
|
||||
private static class Element {
|
||||
char type = 0;
|
||||
StringBuffer eleTextBuff;
|
||||
|
||||
|
@ -692,11 +692,9 @@ public class IKQueryExpressionParser {
|
|||
|
||||
public static void main(String[] args) {
|
||||
IKQueryExpressionParser parser = new IKQueryExpressionParser();
|
||||
//String ikQueryExp = "newsTitle:'的两款《魔兽世界》插件Bigfoot和月光宝盒'";
|
||||
String ikQueryExp = "(id='ABcdRf' && date:{'20010101','20110101'} && keyword:'魔兽中国') || (content:'KSHT-KSH-A001-18' || ulr='www.ik.com') - name:'林良益'";
|
||||
Query result = parser.parseExp(ikQueryExp);
|
||||
System.out.println(result);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -45,6 +45,7 @@ import java.util.List;
|
|||
*
|
||||
* @author linliangyi
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
class SWMCQueryBuilder {
|
||||
|
||||
/**
|
||||
|
@ -118,8 +119,8 @@ class SWMCQueryBuilder {
|
|||
|
||||
// 借助lucene queryparser 生成SWMC Query
|
||||
QueryParser qp = new QueryParser(fieldName, new StandardAnalyzer());
|
||||
qp.setAutoGeneratePhraseQueries(false);
|
||||
qp.setDefaultOperator(QueryParser.AND_OPERATOR);
|
||||
qp.setAutoGeneratePhraseQueries(true);
|
||||
|
||||
if ((shortCount * 1.0f / totalCount) > 0.5f) {
|
||||
try {
|
||||
|
|
Loading…
Reference in New Issue