Lucene体系结构—QueryParse.doc_第1页
Lucene体系结构—QueryParse.doc_第2页
Lucene体系结构—QueryParse.doc_第3页
Lucene体系结构—QueryParse.doc_第4页
Lucene体系结构—QueryParse.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

QueryParser包分析1 QueryParser包的描述1.1 包结构图1.2 UML图图1.2-1 CharStream和FastCharStream图1.2-2 QueryParser及其相关类图1.2-3剩余的类1.3 功能:QueryParser的作用就是解析查询语句,按顺序调用各种 Query类查找出结果。QueryParser包含了解析查询语句的类。用户输入查询语句,查询语句被传到查询分析器中,分析器将将对查询语句进行分析,首先解析字符串的连接符,然后对每个词进行切词,转换为词元。最后得到Search可以处理的查询对象(Query)。Search根据这个查询对象遍历索引树,得到查询结果,并返回查询结果集(Hits)。2 实现细节2.1 具体介绍-QueryParser包中的类:QueryParser包中有如下类: CharStream:该接口类描述了一个保留字符的行列位置的字符流。它在一定程度上还具有备份此字符流的功能。该接口的实施用于JavaCC产生的TokenManager的实施。 FastCharStream:JavaCC的CharStream接口的有效实施。需要注意的是它不做行数计算,而是保持追踪输入中令牌的字符位置。需要Lucene的analysis.Token的API。 MultiFieldQueryParser(extends QueryParser):构造查询搜索多个域。当parse(String query)被调用,会构造这样一个查询(假设查询由两个查询词组成,并指定两个(title:term1 body:term1) (title:term2 body:term2),当setDefaultOperator(AND_OPERATOR)设置,其结果将是:+(title:term1 body:term1) +(title:term2 body:term2) ParseException(extends Exception):解析遇到错误时,抛出异常。可以修改这个类来定制自己的错误报告机制,只要保留了public fields。 QueryParser:这个类是JavaCC产生的。最重要的方法是link #parse(String)。请注意,QueryParser不是线程安全的。当创建QueryParser时,你必须指定所需的版本。 QueryParserConstants:public interface,定义了token常量值和常数,产生自org.javacc.parser.OtherFilesGen#start() QueryParserTokenManager:Token管理 Token:描述输入的Token流。标记Token类型的整数。这个编号系统由JavaCCParser决定,这些数字的表存储在文件. Constants.java中。 TokenMgrError (extends Error):顺序列出为什么这种类型的错误被抛出的各种原因。其中最核心的类是QueryParser,所以接下来我们重点研究这个类。2.2 具体介绍-QueryParser类1、QueryParser类的使用:首先我们举一个代码示例:Query query = null;query = QueryParser.parse(keywords,fieldName,new StandardAnalyzer();从上面代码可以看出,当使用QueryParser构建用户查询语句的Query类时,不仅需要用户输入关键字文本,还需要告诉QueryParser默认将在哪个域中查找该关键字信息。如果用户在输入的关键字中没有给出检索字段信息时,QueryParser就将在默认域内进行检索。QueryParser调用一个StandardAnalyzer,一般来说,创建索引的分析器和查询的分析器最好保持一致。2、QueryParser类中重要的函数: public QueryParser:QueryParser类中最重要的一个函数,也即我们解析Lucene查询语法的时候调用的函数 public Query parse:使用throws将异常抛给ParseException处理 ToplevelQuery:QueryParser.jj中定义的语法分析器被JavaCC编译后会生成的函数。它是在EDF后的一个Query。一个查询语句Query,是由多个clause组成的,每个clause有修饰符Modifier,或为+, 或为-,clause之间的有连接符,或为AND,或为OR,或为NOT。在Lucene的语法解析中NOT被算作Modifier,和-起相同作用。 Query:查询语句开头是一个Modifier,后面便是子语句clause,可以生成子查询语句q。如果第一个语句的Modifier是空,则将子查询q付给firstQuery,从后面我们可以看到,当只有一个查询语句的时候,如果其Modifier为空,则不返回BooleanQuery,而是返回子查询对象firstQuery。从这里我们可以看出,如果查询语句为A,则生成TermQuery,其term为A,如果查询语句为+A,则生成BooleanQuery,其子查询只有一个,就是TermQuery,其term为A。 Clause: Query Term:调用适当的Query类如果是wildcard查询,则调用getWildcardQuery,生成WildcardQuery如果是prefix查询,则调用getPrefixQuery,生成PrefixQuery如果是fuzzy查询,则调用getFuzzyQuery,生成FuzzyQuery,其中还包含一个异常处理。如果是普通查询,则调用getFieldQuery等。3 相关质量属性3.1 质量属性-性能3.1.1 实现方面当用户输入一个关键字,搜索引擎接收到后,并不是立刻就将它放入后台开始进行关键字的检索,而是首先对这个关键字进行一定的分析和处理,使之成为一种后台可以理解的形式,只有这样,才能提高检索的效率,同时检索出更加有效的结果。在Lucene中,这种处理,其实就是用QueryParser包来解析查询语句,构建出Query对象。3.2 质量属性-可修改性:可修改性是系统可以进行快速修改并使修改代价尽可能低的能力,这种能力直接受到体系构架的限制。Lucene所有的功能模块原子化程度非常高,所以它的可修改性也很好。 3.2.1 实现方面-调用Query类Lucene有很多种Query类,目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query对象。它们都继承自Lucene的Search包中的Query的抽象类,这个抽象类有许多子类,代表了不同类型的检索。Lucene 除了支持查询语法以外,还可以自己构造Query对象进行搜索。常见的TermQuery就是将一个简单的关键字进行封装后的对象,是 Lucene 支持的最为基本的一个查询类。类似的还有BooleanQuery,即布尔型的查找。目前Lucene的Query类有:BooleanQuery,FuzzyQuery,MatchAllDocsQuery,MultiTermQuery,MultiPhraseQuery,PhraseQuery,PrefixQuery,TermRangeQuery,TermQuery,WildcardQuery等。由于查询是和具体的使用环境相关的,所以具有新特点的Query类型可以不断的添加到系统中。Queryparser调用这些新的类,实现新的查询功能。3.2.2 实现方面-JavaCC通过查询分析接口的实现,用户可以定制自己的查询语法规则。Lucene中的一些比较复杂的词法分析和语法分析器是用JavaCC生成的。词法分析器就是将一系列字符分成一个个的Token,并标记Token 的分类。这一系列Token 将会被传给语法分析器,形成一棵语法分析树。JavaCC本身既不是一个词法分析器,也不是一个语法分析器,而是根据指定规则生成两者的生成器。JavaCC使用的是编译原理里面的自上而下分析法,基本采用的是LL(1)的方法:第一个L:从左到右扫描输入串第二个L:生成的是最左推导(1):表示向前看一个输入符号(Lookahead) JavaCC还支持Lookahead (n),也即当仅读入下一个符号时,不足以判断接下来的如何解析,会出现Choice Conflict,就需要多读入几个符号,来进一步判断。3.2.3 实现方面-定制QueryParser类我们可以通过重载getWildcardQuery ,getFuzzyQuery,getFieldQuery,getPrefixQuery,getRangeQuery等方法来定制自己的QueryParser类。例如:禁止通配符查询和模糊查询。通配符查询和模糊查询会对性能产生负面影响.如果要禁止通配符查询和模糊查询,我们可以用重载方法抛出一个ParseExceptino异常以禁用这些通配符查询和模糊查询。 但是既然所传入的termStr不会被分析,我们就需要一个特别的方法来处理这一字符串。禁用通配符查询和模糊查询public CustomQueryParser extends Queryparser public CustomQueryParser(String field,Analyzer analyzer) super(field,analyzer); protected final Query getWildcardQuery throws ParseException throw new ParseException(Wildcard not allowed); protected final Query getFuzzyQuery(String field,String termStr) throws ParseException throw new ParseException(Fuzzy queries not allowed); 3.3 质量属性-易用性3.3.1 实现方面-查询语法这个貌似有一部分是search的,可以提供给樊琦参考用户可以很灵活的书写查询语句,得到自己想要的查询结果。Lucene的查询语法和SQL语法有一些类似,有各种保留关键字,按照一定的语法可以组成各种查询,实现查询关键词间的运算,如与、或、非等。Lucene 的语法规则如下:Query := ( Clause )*Clause := +, - : ( | ( Query ) )一个查询语句,是由多个Clause组成的,每个Clause有修饰符Modifier,或为+, 或为-,Clause之间有连接符,或为AND,或为OR,或为NOT。在Lucene 的语法解析中NOT 被算作Modifier,和-起相同作用。Lucene的语法关键字如下:+ - & | ! ( ) * ? : (如果所要查询的查询词中本身包含关键字,则需要用进行转义)。Lucene 支持两种查询词,一种是单一查询词,如hello,一种是词组(phrase),如hello world。在查询语句中,可以指定从哪个域中寻找查询词,如果不指定,则从默认域中查找。查询域和查询词之间用冒号分隔。如 title:Do it right。如果是 title:Do it right,则仅表示在title 中查询Do,而it right 要在默认域中查询。Lucene 支持如下特别一些的查询语法: 通配符查询(Wildcard Searches 类:org.apache.lucene.search.WildcardQuery),支持两种通配符,?表示一个字符,*表示多个字符。通配符可以出现在查询词的中间或者末尾,如te?t,test*,te*t,但决不能出现在开始,如*test,?test。 模糊查询(org.apache.lucene.search.FuzzyQuery):模糊查询的算法是基于Levenshtein Distance,也即当两个词的差别小于某个比例的时候,就算匹配,如roam0.8,即表示差别小于0.2,相似度大于0.8 才算匹配。 临近查询(org.apache.lucene.search.PrefixQuery):在词组后面跟随10,表示词组中的多个词之间的距离之和不超过10,则满足查询。所谓词之间的距离,即查询词组中词为满足和目标词组相同的最小移动次数。如索引中有词组apple boy cat。如查询词为apple boy cat0,则匹配。如查询词为boy apple cat2,距离设为2 方能匹配,设为1 则不能匹配。如查询词为cat boy apple4,距离设为4 方能匹配。 区间查询(org.apache.lucene.search.RangeQuery):区间查询包含两种,一种是包含边界,用A TO B指定,一种是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论