RSS
热门关键字:  数据挖掘  数据仓库  商业智能  人工智能  搜索引擎

关于lucene 结构及内层的研究(一)

来源: 作者:unkonwn 时间:2004-12-06 点击:

lucene 东西太多,一点一点来,先谈下本人对lucene里Query的分析。其他的会在后续作品中发布。如有不足或者我理解上的错误,请email给我,我好及时改正,更新。

数据挖掘研究院

QuerySearch的基本单元,实现各种搜索的方法,下面我简单的列一下他们的作用,

数据挖掘实验室

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"就需要2slop,也就是认为one 向左边移动2, 就是能够匹配的”one two”如果是“five three one” 就需要slope=6才能匹配。还有一点要注意,就是如果碰到stopword,(会在stopAnalyzer中细说),则stopword不用把slop算在内。

数据挖掘研究院

 BooleanQuery 数据挖掘研究院

数据挖掘研究院

 BooleanQuery

数据挖掘研究院

是一个组合的Query, 可以把各种Query添加进去(主要是TernQueryPhraseQuery)并标明他们的逻辑关系,添加条件用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值表示是否包含边界条件本身, beginend必须满足至少有一个不为null及两者都在同一个field. 这里的Range是以StringcompareTo (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中。这里slopephraseQuery雷同,仍然起着对phrase的定位作用,addTerm(Term[] terms)内使用ArrayList来保存Term数据,而Phrase使用的是Vector.

数据挖掘研究院

WildcardQuery 数据挖掘研究院

数据挖掘研究院

WildcardQuery 数据挖掘实验室

WildcardQueryFuzzyQuery是继承MultiTermQuery的,这是他们区别的其他的几种常规Query. Query包含自身全部的匹配,TermFilteredTermEnum提供,而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% 数据挖掘研究院

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?