Solrflux源码分析-Sql Support within Solr-类Sql的solr搜索实现(2)

2019-03-27 00:23|来源: 网路

Solrflux开源codegoogle地址http://code.google.com/p/solrflux/

1.Solrflux概述

Solrflux主要工作是完成Sql
语法到solr语法的转换,并执行查询,保存结果。


当前solrflux已经停止更新了,还是2010.Mar
antlr3.2.jar、1.4solrj的版本。

Solrflux支持
select|update|delete|optimze|commit|rollback|其中在select语法上,

不支持hl、facet、function等高级用法。就目前solrflux代码,基本满足80%的场景。

并且支持直接完整solr原始query
语法,此时不做解析,直接视作完整串,弥补了复杂query串的处理,

也兼容solr语法。

2.Solrflux工作原理、流程


solrflux工作原理:对sql语句执行语法分析,对生产的语法树做语句映射,拼接为solr语法,执行查询。

solrflux工作流程:

(1)将用户输入的sql语法(部分语法带有solr本身query特征,例如commit、optimize),按照自定义的词法、语法、抽象语法定义规则,执行词法分析、语法分析、生成抽象语法树,

主要依赖/grammar/Solrq.g

net.moraleboost.flux.lang包中的SolrqLexer.java
SolrqParser.java

(2)然后对抽象语法树进行遍历,根据nodetype
生成对应类型的statement,例如selectstatment、updatestatement等模板对象。

net.moraleboost.flux.lang包中的StatementListBuilder
这是上层管理对象,然后调用

net.moraleboost.flux.eval.stmt
包中的各种statment。

BaseStatement、CommitStatement、DeleteStatement、InsertStatement、OptimizeStatement、RollbackStatement

SelectStatementUseStement

其中,UseStatement主要任务是server对象的初始化,构建与solrj
client端,自然整个solrflux是基于http协议。非embeded方式工作,是solrjclient中http
client方式。

所有StatementextendsbaseStatement,抽象的baseStatement
实现接口Statement

(3)对生成的statement集合遍历,调用各自的execute方法,执行查询并保存结果。

各statement中保存了各自对应语句的上下文参数,execute方法中执行查询。

3.扩展使用方法

对于语句类型,select、update、commit、delete、optimize、rollback等已经定型了框架。

扩展过程,主要是select过程中,例如hl、facet、function、boost等参数支持。扩展方法

(1)扩展Solrq.g语法规则

(2)生成Lexer、Parser

(3)修改Statement方法

具体细节有:

在对应的语句类型下,修改Solrq.g的tokens、词法、语法、抽象树规则,使用

antlrworks-1.4.3.jar来查看语法结构图、测试语法。

下载antlrworks-1.4.3.jarfromhttp://www.antlr.org/download.html

windows下双击,弹出窗口,选择语法文件。点击debug选项。

input中输入待测试语句、AST中选择语法规则、ParseTree整个语法树构图

如果测试并没有出错,基本上语法扩充是ok的。

solrflux依赖的是antlr.3.2.runtime.jar,如果下载antlr-3.4-complete-no-antlrv2.jar
会出现,那么报错

无法找到server问题。

StatementListBuilder.buildSelectStatement中在
T_FROM中将soucre注入到statment中,对比两个jar

发现树形输出不一样,然后没有注入这个souce。具体问题有待进一步分析。

当词法、语法、抽象树没有问题后,采取anltrwork
字段生成Lexer、Parser代码,将相关代码替换原来的lexerParser,分别是SolrqLexer、SolrqParser

至此,再修改对应statement中的新参数的set、get方法,以及excute中的query拼接。

难点:扩展词法、语法规则并debug。复杂sql语法规则,可以参考antlr
mainlist上的mysql语法规则,基本可以直接引用了。


转自:http://aliapp.blog.51cto.com/8192229/1325829

相关问答

更多
  • 尝试“见面*”而不是“见面*”。 我发现通配符只适用于小写字符串,所以无论何时在搜索查询中包含星号I LCase()字符串,然后将其传递给Solr。 Try "meet*" rather than "Meet*". I've found that wildcards will only work with lower case strings, so whenever a search query contains an asterisk I LCase() the string before passin ...
  • 所以PorterStemFilterFactory从单词中移除常见的结尾。 在你的情况下, agile这个词agil agile 。 你可以在这里查看https://tartarus.org/martin/PorterStemmer/voc.txt 。 (在这里搜索词敏捷)。 现在,在应用Porter Stemming后,在此处搜索相应的输出。 https://tartarus.org/martin/PorterStemmer/output.txt 你会看到你找不到agile这个词,因为它是agile 。 ...
  • SolrJ客户端将查询作为URL参数发送( q=memory&fq=inStock:true ),响应类型为javabin https://wiki.apache.org/solr/javabin 您可以使用apache http客户端并将您的JSON查询和触发请求设置为Solr。 Essentially, we can also set the parameter "json" and the query in SolrJ SolrQuery: SolrQuery.add("json", "{json q ...
  • 我自己找到了答案。 我应该使用More Like This处理程序,而不是使用搜索处理程序的MLT。 MLT处理程序“支持使用CommonQueryParameters进行分面,分页和过滤”(来自wiki)。 启用MLT功能的两种方法http://wiki.apache.org/solr/MoreLikeThis 更像是这个处理程序http://wiki.apache.org/solr/MoreLikeThisHandler#Examples Found the answer myself. I am su ...
  • Solr核心本质上是在应用程序服务器的相同上下文中运行的多个索引。 你可以认为它为每个用户安装了1个war文件 。 每个核心都以名称分隔,因此您必须自己跟踪哪个网址对哪个用户有效。 例如, http://host.com/solr/usercore1/select?q=test http://host.com/solr/usercore2/select?q=test 它基于config solr.xml :
  • 由于DATASOLR-203 , 目前无法直接完成此操作。 解决上述问题后,您可以按以下方式执行此操作: @Configuration @EnableSolrRepositories(multicoreSupport = true) static class SolrConfiguration { @Bean SolrServer solrServer() throws FileNotFoundException { String solrHome = ResourceUtils.get ...
  • 您确定要在架构中使用的列的类型是: 并不是: Did you make sure the type of the column you are using in your ...
  • 我们做了相同的程序来组合solr和mysql,比单个mySql全文搜索快100-1000倍。 因此,您的工作流程/程序通常不是问题。 问题是:你的瓶颈在哪里。 要对此进行调查,您应该查看catalina,以查看每个solr请求的查询时间。 在MySQL上相同 - 查看查询时间/长时间运行的查询。 我们遇到了性能问题,因为返回的PK数量非常大 - >所以mySQL查询非常大,因为where in ()子句的where in ()非常长。 接下来是一个非常大的MySQL语句,其中许多行返回200-1.000.0 ...
  • 我认为您的分析仪链很好。 它将为“铁娘子”制作的是“铁”“少女” 为了能够以简单和反向的方式找到它,您只需要应用正确的查询。 短语/跨度查询将起到作用。 可能的方法: name:"Iron Maiden"和name:"Maiden Iron"~2 ,关于第二个查询的唯一缺点是它还会找到文件"maiden anyword iron"会出现。 I think your analyzer chain is fine. What it will produce for "Iron Maiden" is follow ...
  • 回答我的问题是1维Poly Field ( Solr查询,如果值匹配几个区间之一 ) Thew answer to my question was 1 dimensional Poly Field (Solr query if value matches one of several intervals)