设为首页 收藏本站
查看: 1488|回复: 0

[经验分享] Sql Support within Solr-类Sql的solr搜索实现(1)

[复制链接]

尚未签到

发表于 2018-11-2 06:10:29 | 显示全部楼层 |阅读模式
public>
public static void main(String[] args) throws  
IOException
  
{
  
//ConsoleReader conReader = new ConsoleReader();
  
String filedemo=”testSql2Solr.txt”; // 改为从文件读取sql 语法
  
BufferedReader fileReader = new BufferedReader( new
  
InputStreamReader(new FileInputStream(filedemo)));
  
EvalContext ctx = new EvalContext();
  
StringBuilder builder = new StringBuilder();
  
CharSequenceReader reader = new CharSequenceReader(builder);
  
final String NORMAL_PROMPT = “SQL>”;
  
final String CONTD_PROMPT = “… “;
  
String prompt = NORMAL_PROMPT;
  
String targetUrl=”http://localhost:8080/terminator-search/search4****-0“;
  
String name =”conn”; //这个name 对应testSql2Solr.txt 中的 信息,然后关联到
  
targetUrl
  
UseStatement use = new UseStatement();
  
use.setUrl( targetUrl );
  
use.setName( name );
  
try {
  
use.execute(ctx);
  
} catch (Exception e) {
  
e.printStackTrace();
  
}
  
while (true)
  
{
  
String line = fileReader.readLine();
  
//System.out.println(“–”+line);
  
if ( line == null ) {
  
System.out.println(“line is null so exit”);
  
break;
  
}

  
// String line =”SELECT * FROM conn WHERE>  
builder.append(line + “n”);
  
reader.reset();
  
try {
  
if ( tryEvaluate( reader, ctx ) ) {
  
prompt = NORMAL_PROMPT;
  
} else {
  
prompt = CONTD_PROMPT;
  
continue;
  
}
  
} catch (Exception e) {
  
e.printStackTrace();
  
prompt = NORMAL_PROMPT;
  
}finally{
  
}
  
builder.setLength(0);
  
builder.trimToSize();
  
}
  
fileReader.close();
  
}
  
private static boolean tryEvaluate(Reader reader, EvalContext
  
ctx)
  
throws SyntaxException, EvalException, IOException
  
{
  
//String
  
expr= null;
  
//ANTLRStringStream  in = new
  
ANTLRStringStream(expr);
  
ANTLRReaderStream stream = new ANTLRReaderStream( reader
  
);
  
RecognizerSharedState state = new RecognizerSharedState();
  
SolrqlLexer lexer = new SolrqlLexer(stream, state);//词法分析器
  
CommonTokenStream tokenStream = new
  
CommonTokenStream(lexer);//获取lexer构造的记号流
  
SolrqlParser parser = new SolrqlParser(tokenStream);//语法分析器
  
try {
  
stmt_list_return ret = parser.stmt_list();
  
if (ret != null) {
  
evaluate((CommonTree)ret.getTree(), ctx);
  
}
  
} catch (MismatchedTokenException e) {
  
if (e.getUnexpectedType() == SolrqlParser.EOF) {
  
// immature input. continue.
  
return false;
  
} else {
  
throw new SyntaxException(
  
lexer.getErrorMessage(e, SolrqlParser.tokenNames), e);
  
}
  
} catch (RecognitionException e) {
  
throw new SyntaxException(
  
lexer.getErrorMessage(e, SolrqlParser.tokenNames), e);
  
}
  
return true;
  
}
  
private static void evaluate(CommonTree t, EvalContext ctx)
  
throws EvalException, SyntaxException
  
{
  
printTree(t, 0);
  
List statements = new StatementListBuilder().build(t);
  
for (Statement stmt: statements) {
  
Object ret = stmt.execute(ctx);
  
if ( ret == null ) {
  
System.out.println(“OK.”);
  
continue;
  
}
  
if ( ret instanceof UpdateResponse ) {
  
printUpdateResponse((UpdateResponse)ret);
  
} else if ( ret instanceof SelectStatement.Result ) {
  
printSelectResult((SelectStatement.Result)ret);
  
} else {
  
System.out.println(“Result: ” + ret.toString());
  
}
  
}
  
}
  
private static void printSelectResult(SelectStatement.Result
  
res)
  
{
  
int i=1;
  
for (SolrDocument doc: res.getDocuments()) {
  
System.out.print(Integer.toString(i) + “: “);
  
int j=0;
  
for (Map.Entry e: doc.entrySet()) {
  
if (j > 0) {
  
System.out.print(“, “);
  
}
  
System.out.print(e.getKey() + “=” + e.getValue().toString());
  
++j;
  
}
  
System.out.println();
  
++i;
  
}
  
System.out.println();
  
System.out.println(“Query=” + res.getQuery());
  
System.out.println(
  
“Found ” + res.getResponse().getResults().getNumFound() +
  
” documents, Offset=” +
  
res.getResponse().getResults().getStart()
  
);
  
System.out.println(
  
“Status=” + res.getResponse().getStatus() +
  
“, Elapsed Time=” + res.getResponse().getElapsedTime()
  
);
  
}
  
private static void printUpdateResponse(UpdateResponse res)
  
{
  
System.out.println(
  
“Status=” + res.getStatus() +
  
“, Elapsed Time=” + res.getElapsedTime()
  
);
  
}
  
private static void printTree(Tree t, int indent)
  
{
  
if (t != null) {
  
StringBuffer sb = new StringBuffer(indent);
  
for (int i = 0; i < indent; ++i) {
  
sb =
  
sb.append(“
  
“);
  
}
  
if (!t.isNil()) {
  
System.out.println(sb.toString() + t.toString());
  
++indent;
  
}
  
for (int i = 0; i < t.getChildCount(); ++i) {
  
printTree(t.getChild(i), indent);
  
}
  
}
  
}
  
}



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629502-1-1.html 上篇帖子: 垂直个性化排序之Solr如何支持 下篇帖子: Solr Schema配置小细节大问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表