关于lucene 结构及内层的研究

来源:百度文库 编辑:神马文学网 时间:2024/04/29 11:26:05
lucene 东西太多,一点一点来,先谈下本人对lucene里Query的分析。其他的会在后续作品中发布。如有不足或者我理解上的错误,请email给我,我好及时改正,更新。
Query是Search的基本单元,实现各种搜索的方法,下面我简单的列一下他们的作用,
TermQuery,
最基本的Query,用TermQuery(new Term(Str filed, Str Text));就可以构造, TermQuery把查询条件视为一个key, 要求和查询内容完全匹配,比如Field.Keyword类型就可以使用TermQuery。
PhraseQuery
PhraseQuery
表示可用于非严格语句的查询,匹配包含的指定连续Term, 比如"one five"可以匹配"one two three four five"等, PhraseQuery提供了一个重要的setSlop()参数, 这个参数主要用于设置phrase query中词之间的允许间隔数目,在默认情况下slop的值是0, 就相当于TermQuery的精确匹配, 通过设置slop参数(比如"one five"匹配"one two three four five"就需要slop=3,如果slop=2就无法得到结果。这里我们可以认为slope是单词移动得次数,可以左移或者右移。这里特别提醒,PhraseQuery不保证前后单词的次序,在上面的例子中,"two one"就需要2个slop,也就是认为one 向左边移动2位, 就是能够匹配的”one two”如果是“five three one” 就需要slope=6才能匹配。还有一点要注意,就是如果碰到stopword,(会在stopAnalyzer中细说),则stopword不用把slop算在内。
BooleanQuery
BooleanQuery
是一个组合的Query, 可以把各种Query添加进去(主要是TernQuery和PhraseQuery)并标明他们的逻辑关系,添加条件用public void add(Query query, boolean required, boolean prohibited)方法, 后两个boolean变量分别表示不匹配子Query将不匹配booleanQuery和匹配子Query将不匹配booleanQuery。估计类似google的(+,-)功能。这两个参数不允许同时为true, 否则报错。但两个参数可以都为false,而且必须保证匹配至少一个子query才能用来匹配booleanQuery。 一个BooleanQuery中可以添加多个Query, 但不能超过setMaxClauseCount(int)的值(默认1024个),否则抛出TooManyClauses错误.
RangeQuery
RangeQuery
RangeQuery表示一个范围的搜索条件,RangeQuery query = new RangeQuery(begin, end, included);最后一个boolean值表示是否包含边界条件本身, begin和end必须满足至少有一个不为null及两者都在同一个field. 这里的Range是以String的compareTo (Str)进行比较。所以熟悉j2se的应该很容易确定Range的范围。
PrefixQuery
PrefixQuery
表示匹配是以指定字符串开头的匹配查询, 可以用于Keyword形式的查询。一般的在suggestion里对于single word可以使用的,也可用于查询网络结构目录树的数目。
PhrasePrefixQuery
PhrasePrefixQuery
由于PhraseQuery不能很灵活的适应各种的phrase的匹配。比如要搜索”Sony Cam*”, 先可以把add(Term)把Sony放在Term.,然后把使用IndexReader.Terms(Term)匹配以Cam为前缀的词,最后使用PhrasePrefixQuery.add(Term[] terms)把两者加在Query中。这里slope和phraseQuery雷同,仍然起着对phrase的定位作用,addTerm(Term[] terms)内使用ArrayList来保存Term数据,而Phrase使用的是Vector.
WildcardQuery
WildcardQuery
WildcardQuery和FuzzyQuery是继承MultiTermQuery的,这是他们区别的其他的几种常规Query. Query包含自身全部的匹配,Term由FilteredTermEnum提供,而MultiQuery则是不完全自身的匹配。Term的提供者也不同。WildcardQuery主要使用?和*来表示一个或多个字母的匹配,值得注意的是,在wildcard中,empty对于?和*也是匹配的,且Query的开头不允许用使用?和*.
FuzzyQuery
FuzzyQuery
能模糊匹配英文单词,这个功能非常有用,大小写敏感。可以使用其构造方法FuzzyQuery(Term term, float minimumSimilarity, int prefixLength)方法,还提供2种默认的0.5相似度,和0的前缀状态。相似度比较时要减去非比较的前缀。然后再比。例如,用”soni”匹配”sony”设置相似度前缀为0,则相似度为75%,如果前缀为1,则相似度为66.7%.只要高于最小相似度,便能找到。如果词长度不一致,则以Query减去前缀的为准,例如设前缀为1,用”della”来匹配”dell”,相似度75%, 如果”del”来匹配”dell”则相似度只有50%