Lucene QueryParser的一个"解析异常"

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 假期重新梳理了下之前在新浪博客的历史文档(新浪博客已下线),将一些内容重新搬到这里。 本文Lucene QueryParser的一个解析异常分析。

教训 

    AND OR 之类的请求时候,显示的加括号来 显示控制子查询之间的关系。

    AND OR 用于子句之间的链接

    + - NOT 用于子句的修饰

    构造的规则大体上是  +clause -clause)或者  +clause AND clause-(clause OR clause)


问题背景

Search4realstar 日常,配置lucene queryParser

输入height:165.0 OR weight_num:21 AND shoes_size:37 查无结果

Debugquery 发现解析形式如下:

rawinput    height:165.0 OR weight_num:21 AND shoes_size:37

queryinput  height:165.0 OR weight_num:21 AND shoes_size:37

parsedquery  height:165.0 +weight_num:21 +shoes_size:37 // weight:21子查询被改写了

从而导致 最终执行逻辑和 预设逻辑不一致,查无结果。

eg

raw input  height:165.0 AND weight_num:21 AND shoes_size:37<</b>/str>

query input  height:165.0 AND weight_num:21 AND shoes_size:37

parsedquery +height:165.0 +weight_num:21 +shoes_size:37  //height:165.0子查询被改写了

eg

raw input  height:165.0 AND weight_num:21 OR shoes_size:37<</b>/str>

query input height:165.0 AND weight_num:21 OR shoes_size:37

parsed query +height:165.0 +weight_num:21 shoes_size:37  //height:165.0子查询被改写了


问题追踪

org.apache.lucene.queryParser QueryParser

   protected voidaddClause(List clauses, int conj, int mods, Query q) {

   boolean required, prohibited;

   // If this term is introduced by AND, make the preceding term required,

   // unless it's already prohibited

   if (clauses.size() > 0 && conj == CONJ_AND) {

     BooleanClause c = clauses.get(clauses.size()-1);  //这里覆盖了 OR,当遇到AND的时候,会改写前面一个clause链接关系

     if (!c.isProhibited())

       c.setOccur(BooleanClause.Occur.MUST);

}

 

进一步分析lucene qp的词法、语法规则

词法规则LL(1)

第一个L 从左到右扫描输入串

第二个L :生成的是最左推导

语法规则

Query ::= ( Clause )*

Clause ::= ["+", "-"] [ ":"] ( | "(" Query ")" )

 

层次关系伪逻辑表示如下

相关规则和实现参考: 词法、语法分析QueryParser.jj  QueryParse.java,

Top

-->TopLevelQuery

--\-->Query

--\--\-->Clause 

--\--\--\-->BooleanClause

--\--\--\--\-->TermQuery

 

参考链接 主要是词法、语法规则解读

http://zhaohe162.blog.163.com/blog/static/382167972011112252210215/

http://zhaohe162.blog.163.com/blog/static/382167972011112252312800/

目录
相关文章
|
5月前
|
存储 Java 程序员
Java之异常的详细解析
1. 异常 1.1 异常概念 异常,就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是:
40 0
|
2月前
|
网络协议 Java 数据库连接
13 Java异常(异常过程解析、throw、throws、try-catch关键字)
13 Java异常(异常过程解析、throw、throws、try-catch关键字)
45 2
|
4月前
|
Java 网络安全
解析connectionReset异常的原因与解决方案
解析connectionReset异常的原因与解决方案
|
5月前
|
存储 编解码 API
【解码与渲染 异常情况】深入解析视频中绿色竖线现象(一)
【解码与渲染 异常情况】深入解析视频中绿色竖线现象
172 6
【解码与渲染 异常情况】深入解析视频中绿色竖线现象(一)
|
5月前
|
人工智能 Go 开发者
Golang语言异常机制解析:错误策略与优雅处理
Golang语言异常机制解析:错误策略与优雅处理
|
5月前
|
存储 编解码 算法
【解码与渲染 异常情况】深入解析视频中绿色竖线现象(二)
【解码与渲染 异常情况】深入解析视频中绿色竖线现象
121 1
|
安全 Java 测试技术
避免低级错误:深入解析Java的ConcurrentModificationException异常
在软件开发中,我们常常会遇到各种错误和异常。其中有一类比较低级但又常见的错误就是`ConcurrentModificationException`异常。最近了我就写了个这种异常,这个异常通常发生在使用迭代器遍历集合时,同时对集合进行修改,从而导致迭代器检测到集合结构发生变化而抛出异常。在测试环境中可能因为数据量较小或者测试场景不充分未能显现问题,但一旦部署到生产环境,场景增多,并发操作增多,这个低级错误就会爆发。
316 0
避免低级错误:深入解析Java的ConcurrentModificationException异常
|
5月前
|
SQL JSON Apache
Flink问题之嵌套 json 中string 数组的解析异常如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
274 1
|
5月前
|
JSON API 数据格式
dragonBones5.6.300解析关键帧的actions异常的bug
dragonBones5.6.300解析关键帧的actions异常的bug
51 0
|
5月前
|
JSON 数据格式
这个错误是由于在解析JSON数据时出现了问题。你可以尝试使用`try-except`语句来捕获异常
这个错误是由于在解析JSON数据时出现了问题。你可以尝试使用`try-except`语句来捕获异常
56 2

热门文章

最新文章

推荐镜像

更多
下一篇
无影云桌面