知识点
相关文章
更多最近更新
更多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 ...
-
Solr搜索没有回应文件(Solr search not returing documents)[2022-01-05]
所以PorterStemFilterFactory从单词中移除常见的结尾。 在你的情况下, agile这个词agil agile 。 你可以在这里查看https://tartarus.org/martin/PorterStemmer/voc.txt 。 (在这里搜索词敏捷)。 现在,在应用Porter Stemming后,在此处搜索相应的输出。 https://tartarus.org/martin/PorterStemmer/output.txt 你会看到你找不到agile这个词,因为它是agile 。 ... -
Solr Json支持(Solr Json Support)[2022-08-24]
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 MultiCore搜索(Solr MultiCore Search)[2023-02-19]
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 ...反向搜索Solr搜索?(Solr search with reversed term?)[2023-01-29]
我认为您的分析仪链很好。 它将为“铁娘子”制作的是“铁”“少女” 为了能够以简单和反向的方式找到它,您只需要应用正确的查询。 短语/跨度查询将起到作用。 可能的方法: 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)